gpt4 book ai didi

typescript - tsconfig 和环境声明中的项目引用

转载 作者:行者123 更新时间:2023-12-04 12:42:17 26 4
gpt4 key购买 nike

我正在尝试将我的 Typescript 项目配置为具有以下目录结构:

src/
├── client/
│ └── tsconfig.json

├── server/
│ └── tsconfig.json

├── shared/
│ ├── utils/
│ │ └── type-utils.d.ts
│ │
│ └── tsconfig.json

└── tsconfig-base.json
  • client/tsconfig.json , server/tsconfig.json , 和 shared/tsconfig.json各有"extends": "../tsconfig-base.json"
  • client/tsconfig.jsonserver/tsconfig.json两者都有"references": [{ "path": "../shared" }]
  • shared/utils/type-utils.d.ts不是模块,而是包含环境类型声明,如 IdCouldBeNull ,以及 Array 的声明合并(定义 flatMap 方法)。

  • 这个想法是 tsconfig-base.json可以包含很多常用的设置,个人 tsconfig.json s 可以定义与该子项目相关的设置(例如 React for client/tsconfig.json ,Node for server/tsconfig.json )和 shared/将在 client/ 之间共享和 server/ .

    问题是环境声明和声明合并 shared/utils/type-utils.ts不被 client/ 看到或 server/ ,但仅限于 shared/ .这会导致错误,例如 tsc -b client --verbose产生

    $ tsc -b client --verbose
    15:31:41 - Projects in this build:
    * shared/tsconfig.json
    * client/tsconfig.json

    15:31:41 - Project 'shared/tsconfig.json' is up to date because newest input 'shared/formatting/numbers.ts' is older than oldest output 'shared/formatting/numbers.js.map'

    15:31:41 - Project 'client/tsconfig.json' is out of date because output file 'client/client/index.js' does not exist

    15:31:41 - Building project 'C:/Users/KRyan/Web/5heet/client/tsconfig.json'...

    client/index.tsx(32,29): error TS7006: Parameter 'skill' implicitly has an 'any' type.
    client/index.tsx(80,37): error TS2339: Property 'flatMap' does not exist on type 'Ability[]'.
    client/index.tsx(80,45): error TS7006: Parameter 'ability' implicitly has an 'any' type.
    client/index.tsx(88,16): error TS7006: Parameter 'one' implicitly has an 'any' type.
    client/index.tsx(88,21): error TS7006: Parameter 'another' implicitly has an 'any' type.
    client/index.tsx(151,32): error TS7031: Binding element 'id' implicitly has an 'any' type.
    client/parts/editing.tsx(31,60): error TS2339: Property 'oneOperand' does not exist on type 'never'.
    client/parts/editing.tsx(31,81): error TS2339: Property 'operator' does not exist on type 'never'.
    client/parts/editing.tsx(31,108): error TS2339: Property 'anotherOperand' does not exist on type 'never'.
    client/parts/portal.tsx(55,61): error TS2304: Cannot find name 'Omit'.
    shared/ability.d.ts(2,33): error TS2304: Cannot find name 'Id'.
    shared/ability.d.ts(8,36): error TS2304: Cannot find name 'Id'.
    shared/ability.d.ts(12,37): error TS2304: Cannot find name 'Id'.
    shared/character.d.ts(3,35): error TS2304: Cannot find name 'Id'.
    shared/expression.d.ts(7,35): error TS2304: Cannot find name 'Id'.
    shared/expression.d.ts(30,38): error TS2304: Cannot find name 'ElementOf'.
    shared/expression.d.ts(33,118): error TS2304: Cannot find name 'Id'.
    shared/formatting/numbers.d.ts(1,41): error TS2304: Cannot find name 'Id'.
    shared/skill.d.ts(3,31): error TS2304: Cannot find name 'Id'.
    shared/utils/basic.d.ts(5,46): error TS2304: Cannot find name 'CouldBeNull'.

    隐式 any类型是由于无法找到输出后半部分列出的各种名称而直接导致的。

    而且,为了完整起见,完整的文件:
    shared/utils/type-utils.d.ts :
    type PropsOf<T> = T[keyof T];
    type ElementOf<T> = T extends (infer E)[] ? E : T;
    type Subtract<T, U> = Pick<T, Exclude<keyof T, keyof U>>;
    type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
    type CouldBeNull<T> = null extends T ? unknown : never;

    type DeepPartial<T> = {
    [P in keyof T]?: T[P] extends Array<infer U>
    ? Array<DeepPartial<U>>
    : T[P] extends ReadonlyArray<infer U>
    ? ReadonlyArray<DeepPartial<U>>
    : DeepPartial<T[P]>
    };

    declare class Tagged<Tag> {
    private 'is tagged as': [Tag];
    private dummy(): Tag;
    }
    type Id<Tag> = string & Tagged<Tag>;

    interface Array<T> {
    /**
    * Calls a defined callback function on each element of an array. Then, flattens the result into
    * a new array.
    * This is identical to a map followed by a flatten of depth 1.
    *
    * @param callback A function that accepts up to three arguments. The flatMap method calls the
    * callback function one time for each element in the array.
    * @param thisArg An object to which the this keyword can refer in the callback function. If
    * thisArg is omitted, undefined is used as the this value.
    */
    flatMap<U, This = undefined>(
    callback: (this: This, value: T, index: number, array: T[]) => U | U[],
    thisArg?: This,
    ): U[];
    }
    tsconfig-base.json :
    {
    "compileOnSave": true,
    "compilerOptions": {
    "target": "es2018",
    "baseUrl": ".",
    "module": "amd",
    "moduleResolution": "classic",
    "paths": {
    "csstype": [
    "node_modules/csstype/index"
    ],
    },
    "composite": true,
    "declaration": true,
    "declarationMap": true,
    "noEmitOnError": true,
    "strictNullChecks": true,
    "allowJs": false,
    "allowUnusedLabels": false,
    "noImplicitAny": true,
    "noImplicitThis": true,
    "noImplicitReturns": true,
    "noUnusedParameters": true,
    "noFallthroughCasesInSwitch": true,
    "noStrictGenericChecks": true,
    "noUnusedLocals": true,
    "noErrorTruncation": true,
    "allowUnreachableCode": false,
    "forceConsistentCasingInFileNames": false,
    "preserveConstEnums": true,
    "sourceMap": true
    }
    }
    client/tsconfig.json :
    {
    "extends": "../tsconfig-base.json",
    "include": [
    "**/*.ts"
    ],
    "outDir": "../../built/client",
    "compilerOptions": {
    "rootDir": "..",
    "jsx": "react",
    "types": [
    "react",
    "react-dom"
    ]
    },
    "references": [
    {
    "path": "../shared"
    }
    ],
    "watch": true
    }
    server/tsconfig.json :
    {
    "extends": "../tsconfig-base.json",
    "include": [
    "**/*.ts"
    ],
    "outDir": "../../built/server",
    "compilerOptions": {
    "rootDir": "..",
    "module": "commonjs",
    "types": [
    "node",
    "mime-types"
    ]
    },
    "references": [
    {
    "path": "../shared"
    }
    ]
    }
    shared/tsconfig.json :
    {
    "extends": "../../tsconfig-base.json",
    "include": [
    "**/*.ts"
    ],
    "outDir": "built/shared",
    "compilerOptions": {
    "module": "amd",
    "types": []
    }
    }

    最佳答案

    想出了一个解决方案,尽管我对此并不感冒:
    client/tsconfig.json :

    {
    "extends": "../tsconfig-base.json",
    "include": [
    "**/*.ts",
    "**/*.tsx",
    "../shared/utils/type-utils.d.ts"
    ],
    "outDir": "../built/client",
    "compilerOptions": {
    "baseUrl": "..",
    "rootDir": "..",
    "jsx": "react",
    "types": [
    "react",
    "react-dom"
    ]
    },
    "references": [
    {
    "path": "../shared"
    }
    ],
    "watch": true
    }

    请注意 ../shared/utils/type-utils.d.tsinclude部分。这解决了问题。

    我对这个解决方案并不感冒,因为它意味着在 shared/ 中明确列出某些内容而不仅仅是作为项目引用的结果被包含在内。我对我必须手动更新我的 tsconfig.json 的想法感到不高兴s 为每个新 .d.ts我要添加的文件 shared/ .但这是一个答案,因为该项目已构建,而且我不太可能添加更多我自己的 .d.ts文件到项目,所以我的担忧可能是这个项目的哲学/理论。

    关于typescript - tsconfig 和环境声明中的项目引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53543539/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com