首页 > 解决方案 > Angular 无法编译 Typescript 的映射类型修饰符

问题描述

我有一个 node.js 项目,我成功地使用了自定义映射类型

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:需要声明或声明。

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

谢谢大家!!

标签: angulartypescriptmodifiermapped-types

解决方案


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

您可以使用一种技巧来实现先前版本的 typescript 中的 remove readonly 结果,如此处所述

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

推荐阅读