【问题标题】:Angular can't compile Typescript's mapped type modifiersAngular 无法编译 Typescript 的映射类型修饰符
【发布时间】:2023-03-21 22:51:01
【问题描述】:

我有一个 node.js 项目,我成功地使用了自定义 mapped type

export type Mutable<T> = {
    -readonly [P in keyof T]: T[P];
};

但是如果我将相同的代码添加到 Angular 6 项目中,编译会失败:

src/assets/scripts/utils.ts(2,5) 中的错误:错误 TS1131:需要属性或签名。
src/assets/scripts/utils.ts(2,27): 错误 TS1005: ']' 预期。
src/assets/scripts/utils.ts(2,28): 错误 TS1005: ';'预计。
src/assets/scripts/utils.ts(14,29):错误 TS1128:需要声明或声明。
src/assets/scripts/utils.ts(3,1):错误 TS1128:需要声明或声明。

为什么会发生这种情况,我该如何解决?

提前谢谢大家!!

【问题讨论】:

    标签: angular typescript modifier mapped-types


    【解决方案1】:

    您使用的是旧版本的 typescript(2.7 或更低版本)。仅在 2.8 中添加了显式删除readonly 修饰符的功能(请参阅PRRoadmap)。

    here 所述,您可以使用技巧在先前版本的打字稿中实现删除只读结果@

    type MutableHelper<T, TNames extends string> = { [P in TNames]: (T & { [name: string]: never })[P]};
    type Mutable<T> = MutableHelper<T, keyof T>;
    

    【讨论】:

    • keyof T 被标记为错误,表示:Type 'keyof T' 不满足约束 'string'。键入'字符串 |号码 |符号'不可分配给类型'字符串'。类型“数字”不可分配给类型“字符串”。
    • @Sergio Hm .. 我认为您的 Visual Studio 使用的是 3.0,而您的构建使用的是 2.7...您可以从右下角切换 VS 使用的版本.. 在 2.9 中我认为 @987654326 @ 不仅是 string 也是 string | number | symbol
    • 我正在使用当前的 vscode 版本,即 2.9.2。
    • 试图从 2.9.2 降级到 2.7.2 (ng 6) 但错误太多,我想我会使用 2 个单独的版本,并避免共享那段代码。这只是一个学校项目......谢谢你的时间先生!
    • @Sergio 是的,我知道Extract 但这是一个 2.8+ 的功能,而解决方法应该是 2.7 或更低...
    【解决方案2】:

    最新的@angular/cli@6.1.1使用typescript@~2.7.2,映射类型是@typescript@^2.8的一个特性。

    【讨论】:

      猜你喜欢
      • 2018-09-14
      • 2020-09-08
      • 2019-11-12
      • 2021-04-21
      • 2019-05-07
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多