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

Angular can't compile Typescript's mapped type modifiers

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

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

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

ERROR in src/assets/scripts/utils.ts(2,5): error TS1131: Property or signature expected.
src/assets/scripts/utils.ts(2,27): error TS1005: ']' expected.
src/assets/scripts/utils.ts(2,28): error TS1005: ';' expected.
src/assets/scripts/utils.ts(14,29): error TS1128: Declaration or statement expected.
src/assets/scripts/utils.ts(3,1): error TS1128: Declaration or statement expected.

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

先谢谢大家!!

您使用的是旧版本的 typescript(2.7 或更低版本)。明确删除 readonly 修饰符的能力仅在 2.8 中添加(请参阅 PR and Roadmap)。

您可以使用一个技巧来实现删除 readonly 结果,如前所述

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

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