web-dev-qa-db-ja.com

カスタム.d.tsファイルはどこに配置すればよいですか?

私はそれらを持たないパッケージにタイピングを提供しようとしています:

error TS7016: Could not find a declaration file for module 'inputmask-core'. './node_modules/inputmask-core/lib/index.js' implicitly has an 'any' type.
Try `npm install @types/inputmask-core` if it exists or add a new declaration (.d.ts) file containing `declare module 'inputmask-core';`

Typepack 2.4.2でwebpackのts-loaderを使用していますが、tsconfig.jsonで次のタイプルートを設定しています。

"typeRoots": [
  "./node_modules/@types",
  "./src/client/types"
]

node_modules/@typesのパッケージ構造を模倣しようとしました:

src/client/types
|--inputmask-core
  |--index.d.ts

index.d.tsに以下を含めて:

declare class InputMask {}
export default InputMask;

しかし、エラーはまだそこにあります。私は何を間違えていますか?これらのカスタム.d.tsファイルはどこに配置すればよいですか?

node_modules/@typesと他のタイプのルートの違いは何ですか? TypeScriptがそれらを異なる扱いをするのはなぜですか?

24
Rogach

TypeRootsの代わりにパスを使用します-

https://github.com/Microsoft/TypeScript/issues/22217#issuecomment-369783776 経由

「typeRoots」はグローバルコード用です。つまり、グローバル名前空間で宣言されているもので、それを含めたいものです。モジュールの場合、独自のスコープがあり、必要なのはパスマッピングだけです。

{
"compilerOptions": {
    "target": "es2017",
    "baseUrl": "./",
    "paths": {
        "*" : ["src/client/@custom_types/*"]
    }
},
"exclude": ["node_modules", "src/client/@custom_types", ...]
}

注:パスにはbaseUrlが必要です。おそらく、除外するディレクトリも追加する必要があります。

6
Ville

考えられる解決策:以下をindex.d.tsに配置すると、コンパイルされます。

declare module "inputmask-core" {
    declare class InputMask {}
    export default InputMask;
}

私はまだnode_modules/@typesが取得します。

3
Rogach