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 的映射类型修饰符的主要内容,如果未能解决你的问题,请参考以下文章
Typescript 编译器错误预期带有 Angular 1.5 组件的分号
Angular 库应该用 typescript 编写还是编译成 javascript
在没有 TypeScript Transpiler 的情况下使用 Angular 2