programing

ts-node는 tsc가 프로젝트를 정상적으로 컴파일하는 동안 d.ts 파일을 무시합니다.

showcode 2023. 4. 5. 22:30
반응형

ts-node는 tsc가 프로젝트를 정상적으로 컴파일하는 동안 d.ts 파일을 무시합니다.

TypeScript 프로젝트를 성공적으로 컴파일한 후 VS Code의 디버깅모드로 실행하려고 했습니다.ts-node문제는...ts-node찾을 수 없다d.ts작성한 파일(중)tsc문제가 없습니다).

프로젝트 구조:

/
    conf/
    dist/
    src/
        types/
package.json
tsconfig.json

tsconfig.json관련 엔트리는 다음과 같습니다.

{
    "compilerOptions": {
        "target": "es2017",
        "module": "commonjs",
        // "lib": [],
        "sourceMap": true,
        "outDir": "dist",
        "rootDir": "src",
        "moduleResolution": "node",
        "baseUrl": ".",
        "paths": {
            "*": [
                "node_modules/*",
                "src/types/*"
            ]
        },
        // "rootDirs": [],
        // "typeRoots": [],
        // "types": [],
    },
    "include": [
        "src/**/*"
    ]
}

정의 파일ts-node찾을 수 없다src/types/global.d.ts:

import { App } from '../App';

declare global {
    namespace NodeJS {
        interface Global {
            app: App;
        }
    }
}

그래서, 그걸 실행하려고 하는 건ts-node알겠습니다.

TSError: ⨯ Unable to compile TypeScript:
src/boot.ts(15,59): error TS2339: Property 'app' does not exist on type 'Global'.

글로벌하게 해결하는 방법나는 그것을 발견했다./// <reference path="./types/global.d.ts" />하지만 모든 파일에서 이 작업을 반복해야 합니다.global.app.

내 TypeScript 버전은 3.0.1입니다.

저도 비슷한 문제가 있었는데 추가하지 못했어요.--files왜냐하면 나는 달리기 때문이다.ts-node를 통해 모듈을 등록함으로써mocha(즉,mocha -r ts-node/register ...).

이 문제를 해결하려면files및 ats-node로 나누다.tsconfig.json다음과 같습니다.

// tsconfig.json
{
  "ts-node": {
    "files": true
  },
  "files": [
    "src/index.ts",
    "src/global.d.ts"
  ],
  "compilerOptions":{
    //...
  }
}

7.0.0의 ts-node부터는 파일을 로드하지 않습니다.tsconfig.json를 클릭합니다.대신, 특정할 필요가 있습니다.--files이것처럼.

ts-node --files src/boot.ts

TLDR

더하다"ts-node": { "files": true },tsconfig.json위해서ts-node-dev예상대로 작동하다

설명:

사용하고 있었습니다.ts-node-devpackage.json예를 들어 다음과 같습니다.

"scripts": {
    "build": "tsc",
    ...
    "dev": "ts-node-dev src/index.ts"
  },

npm run build정상적으로 동작하고 있었습니다만,npm run dev실패했습니다. 내 유형 정의 파일이 다음 위치에 있습니다.src/types/*.

다음 항목을 추가하자 정상적으로 작동하기 시작했습니다.tsconfig.json

{
  "ts-node": {  "files": true }, // add this
  "compilerOptions": {
     ...
  }
}

내가 그걸 고친 방법은 이렇다.개발 스크립트에 "nodemon --exec ts-node --files src/app.ts"를 추가합니다.

 "scripts": {
    "start": "node dist/app.js",
    "dev": "nodemon --exec ts-node --files src/app.ts",
    "build": "tsc -p",
    "test": "echo \"Error: no test specified\" && exit 1"
  },

저는 이 문제에 대해 많은 시간을 들여서 type에 제 타이핑 폴더 추가, 구조 타이핑/모듈/index.d.ts를 가진 타이핑 폴더 생성 등 거의 모든 것을 시도했습니다만, 아무것도 해결되지 않았기 때문에, 지금 위의 답변이 무엇을 의미하는지 알게 되었습니다.

새로운 버전의 ts-node를 사용하여 프로젝트 스크립트에 맞게 변경했습니다.

ts-node@6: ts-node src/index.ts
ts-node@7: ts-node --files src/index

따라서 스크립트는 다음과 같이 변경됩니다.

"scripts": {
    "dev": "nodemon --exec ts-node --files src/index",
  }

위와 같이 실행하면서 당신의 컴파일 시간이 많이 늘어났지만, 저는 더 이상 시간을 할애할 수 없어서 위의 내용을 고수하고 있습니다.

또, https://github.com/TypeStrong/ts-node#missing-types 를 참조할 수도 있습니다.

다른 솔루션은 모두 좋지만 ts-node 권장 메서드(ts-node에 따라 마지막 수단인 --files 사용 제외)는 https://www.npmjs.com/package/ts-node#missing-types에서 찾을 수 있습니다.

사용 사례와 선호도에 따라 3가지 유형을 권장합니다.

  1. tsconfig.json에서 compiler Options.typeRoots 사용

글로벌 정의에 대해서는 typeRoots 컴파일러 옵션을 사용할 수 있습니다.이를 위해서는 유형 정의를 유형 패키지로 구성해야 합니다(느슨한 TypeScript 정의 파일이 아님).작동 방식에 대한 자세한 내용은 TypeScript 핸드북을 참조하십시오.

{
  "compilerOptions": {
    "typeRoots" : ["./node_modules/@types", "./typings"]
  }
}
  1. tsconfig.json 경로 사용

모듈 정의에는 경로를 사용할 수 있습니다.

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "custom-module-type": ["types/custom-module-type"]
    }
  }
}
  1. 트리플 슬래시 지시어 사용

또 다른 옵션은 트리플 슬래시 디렉티브입니다.이는 컴파일러 옵션을 변경하거나 type Roots에 대한 유형 정의를 구성하지 않는 경우에 유용합니다.다음은 프로젝트 내 상대 경로로서의 트리플 슬래시 지시어의 예입니다.

/// <reference path="./types/lib_greeter" />
import {Greeter} from "lib_greeter"
const g = new Greeter();
g.sayHello();

언급URL : https://stackoverflow.com/questions/51610583/ts-node-ignores-d-ts-files-while-tsc-successfully-compiles-the-project

반응형