Angular 无法编译 Typescript 的映射类型修饰符

Posted

技术标签:

【中文标题】Angular 无法编译 Typescript 的映射类型修饰符【英文标题】:Angular can't compile Typescript's mapped type modifiers 【发布时间】:2019-01-07 19:32:51 【问题描述】:

我有一个 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:需要声明或声明。

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

提前谢谢大家!!

【问题讨论】:

【参考方案1】:

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

如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的一个特性。

【讨论】:

以上是关于Angular 无法编译 Typescript 的映射类型修饰符的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2 Typescript 编译错误

Typescript 编译器错误预期带有 Angular 1.5 组件的分号

Angular 库应该用 typescript 编写还是编译成 javascript

在没有 TypeScript Transpiler 的情况下使用 Angular 2

TypeScript 编译中缺少 Angular5 :polyfills.ts & \main.ts

无法让 Angular2 + gulp 项目工作