ウェブサイト検索

型 - 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 は一般的にあなたのカスタム型定義を気にしないからです。

関連記事