型 - TypeScriptでChaiの 'expect()' 関数をグローバルにインポートするにはどうすればよいですか?
他の関連する質問は単にJavaScriptについて尋ねられていますが、Chaiチームがすでに 'chai/register-expect' などを提供していることは知っています。
私は Jest から Chai に移行していましたが、Jest を使っていたときは、tsconfig.json ファイルの "types" フィールドに 'jest' と入力するだけで済みました。すると expect 関数は自動的に @types/jest index.d.ts で参照されました。
しかし、@types/chai や Chai はこれをサポートしていません。そして、問題を報告する前に、Stack Overflow に投稿することを推奨しています。いったいどういうことでしょうね?
これについて調べた後、TypeORMや他のTypeScriptプロジェクトのように、みんながファイルごとに'expect'関数をインポートしていることに気付きました… まじで、これは本当にひどいです。
いったいなぜ1ファイルごとにexpect()をインポートしなければならないのですか?それを避ける方法はないのでしょうか?
私はJestに戻ることができますが、そのパフォーマンスはひどく最悪です。すべてのファイルにexpectsをインポートする方が良いです。
mocha -r chai/register-expect も動作しません。
私はテストしていました:
npx mocha -r node_modules/ts-node/register/transpile-only -r chai/register-expect -r ts-node/register -r tsconfig-paths/register some.test.ts
こちらが私のtsconfig.jsonファイルです。
{
"compilerOptions": {
"module": "commonjs",
"esModuleInterop": true,
"target": "es5",
"noImplicitAny": false,
"moduleResolution": "node",
"sourceMap": true,
"outDir": "dist",
"baseUrl": "src",
"skipLibCheck": true,
"downlevelIteration" : true,
"paths": {
... bla bla
"main/*" : [
"main/*"
],
"controllers/*" : [
"main/controllers/*"
],
"middleware/*" : [
"main/middleware/*"
],
"*": [
"node_modules/*"
]
},
"types" : [
"node",
"mocha",
"chai"
],
"typeRoots": [
"node_modules/@types",
"types"
],
"lib": [
"es2017",
"dom"
],
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"resolveJsonModule" : true
},
"exclude": [
"node_modules"
],
"include": [
"src/**/*.ts",
"**/*.test.ts"
]
}
回答 #1
`chai/register-expect` はグローバルな Chai 関数 `expect` を登録します。
カスタム定義ファイルを作成して、TypeScriptコンパイラーにそれがあることを説明する必要があります。
ディレクトリ構造を作成する:
typings
global
index.d.ts
あなたのindex.d.tsファイルに、次の内容を追加してください:
declare const expect: Chai.ExpectStatic
これで、あなたの tsconfig.json はおおよそ次のようになっているはずです:
"typeRoots": [
"node_modules/@types", "./typings"
],
"types": [
"mocha",
"chai",
"node",
"global"
]
typings ディレクトリと global モジュールのインポートに注目してください。
これは必要です、なぜなら ts-node は一般的にあなたのカスタム型定義を気にしないからです。
