source

TypeScript skipLibCheck가 node_modules libs를 아직 검사하고 있습니다.

lovecheck 2023. 2. 17. 21:36
반응형

TypeScript skipLibCheck가 node_modules libs를 아직 검사하고 있습니다.

TypeScript를 React와 함께 사용하고 있습니다.TypeScript는 tsconfig.json에서 "skipLibCheck"가 true로 설정되어 있는데도 node_modules 폴더의 라이브러리를 체크하고 있습니다.

다음은 tsconfig.json입니다(트러블 슈팅을 위해 제외 섹션을 추가했습니다만, 이것도 동작하지 않았습니다).

{
  "compilerOptions": {
    "target": "es5",
    "forceConsistentCasingInFileNames": true,
    "module": "commonjs",
    "jsx": "react",
    "declaration": true,
    "sourceMap": true,
    "experimentalDecorators": true,
    "skipLibCheck": true,
    "typeRoots": [
      "./node_modules/@types"
    ],
    "types": [
      "es6-promise",
      "webpack-env"
    ],
    "lib": [
      "es5",
      "dom",
      "es2015.collection"
    ]
  }, 
  "exclude": [
    "node_modules",
    "./node_modules",
    "./node_modules/*",
    "./node_modules/@types/node/index.d.ts",
  ]
}

사용 중인 리액트 버전은 15.4.2이며 TypeScript는 글로벌하게 설치됩니다.버전 3.7.2를 사용하고 있었는데, SkipLibCheck가 3.7.2에서 동작하지 않는다는 것을 어디서 읽었기 때문에 3.7.3으로 업그레이드했습니다.

프로젝트를 단숨에 구축하려고 할 때 발생하는 오류는 다음과 같습니다.

Error - typescript - node_modules\gsap\types\gsap-utils.d.ts(97,75): error TS1144: '{' or ';' expected

skipLibCheck를 false로 설정하고 프로젝트를 빌드하면 오류가 더 많이 발생합니다.skipLibcheck는 부분적으로 기능하는 것 같습니다.

이 문제를 해결할 방법이 있나요?저는 아직 TypeScript를 처음 접합니다.어떤 도움이라도 주시면 감사하겠습니다.

skipLibCheck는 node_module 내의 모든 유형의 체크를 막는 것을 목적으로 하고 있지 않습니다.어떤 프로젝트에서는 효과가 있을지 몰라도 그냥 우연일 뿐이에요.부분적으로는 효과가 있다고 할 수 있죠, 맞아요.그 기능은 다음과 같습니다.

Lib Check 건너뛰기 - skipLib Check

선언 파일의 형식 확인을 건너뜁니다.

이렇게 하면 컴파일하는 동안 시간을 절약할 수 있지만 유형 시스템의 정확성을 희생할 수 있습니다.예를 들어, 두 라이브러리가 일관되지 않은 방식으로 동일한 유형의 두 복사본을 정의할 수 있습니다.TypeScript는 모든 d.ts 파일을 전체 검사하는 대신 앱의 소스 코드에서 구체적으로 참조하는 코드 check를 입력합니다.

skipLibCheck를 사용하는 일반적인 경우는 node_modules에 라이브러리 유형의 복사본이 두 개 있는 경우입니다.이러한 경우, 실의 해상도등의 기능을 사용해, 트리에 의존 관계의 카피가 1개 밖에 없는 것을 확인하거나, 툴의 추가 없이 문제를 수정하기 위한 의존 관계 해결을 이해하고, 카피가 1개 밖에 없는 것을 확인하는 방법을 조사할 필요가 있습니다.

skipLibCheck는 Typescipt 2.0에서 도입되었기 때문에 Typescript 업그레이드는 수정 사항이 아닙니다.그래도 몇몇 사람들에게는 효과가 있을 수 있다.Typescript 3을 사용하는 프로젝트에 Typescript 4를 사용하여 라이브러리를 추가해야 하는 경우가 있었습니다.조립 오류가 빗발치듯 쏟아졌다.같은 버전의 타이프스크립트가 있으면 도움이 됩니다.타이프 스크립트의 버전은 여기서의 프로젝트에 고유합니다.

있는 유일한 은 가가 i i i i i i i i i i i i i i i i i를 하는 것이다.requireimport (프로젝트는 백엔드였다)

import * as lib from 'lib';
const lib = require('lib');

skipLib은 .d.ts 오류만 건너뛸 수 있습니다.단, node_modules에서 직접 .ts 파일을 사용하는 경우 tsc는 유형 오류를 발생시킬 수 없습니다.node_modules 내의 모든 .ts 파일 앞에 "// @ts-noCheck"를 추가할 수 있습니다.

node_modules 내의 모든 .ts**tsx 파일 앞에 // @ts-ignore를 추가하기 위한 노드스크립트를 다음에 나타냅니다.tsc를 실행하기 전에 실행할 수 있습니다.

// 将 node_modules 下面的每个 ts,tsx 文件头部都加上 // @ts-noCheck,以忽略 node_modules 下面的类型错误
const fs = require('fs');
const path = require('path');
const traversalPath = `./node_modules`;

function folderTraveral(filePath) {
    // 根据文件路径读取文件,返回文件列表
    fs.readdir(filePath, function (err, files) {
        if (err) {
            console.warn(err);
        } else {
            // 遍历读取到的文件列表
            files.forEach(function (filename) {
                // 获取当前文件的绝对路径
                const filedir = path.join(filePath, filename);
                // 根据文件路径获取文件信息,返回一个fs.Stats对象
                fs.stat(filedir, function (eror, stats) {
                    if (eror) {
                        console.warn('获取文件stats失败');
                    } else {
                        const isFile = stats.isFile(); // 是文件
                        const isDir = stats.isDirectory(); // 是文件夹
                        if (
                            isFile &&
                            !filedir.endsWith('d.ts') &&
                            (filedir.endsWith('ts') || filedir.endsWith('tsx'))
                        ) {
                            let content = fs.readFileSync(filedir, 'utf-8');
                            if (!content.startsWith('// @ts-nocheck')) {
                                content = '// @ts-nocheck \n' + content;
                                fs.writeFileSync(filedir, content, 'utf-8');
                            }
                        }
                        if (isDir) {
                            folderTraveral(filedir); // 递归,如果是文件夹,就继续遍历该文件夹下面的文件
                        }
                    }
                });
            });
        }
    });
}

folderTraveral(traversalPath);

언급URL : https://stackoverflow.com/questions/59906323/typescript-skiplibcheck-still-checking-node-modules-libs

반응형