TypeScript交集类型和只读属性

时间:2018-04-03 19:55:30

标签: typescript

我正在尝试在TypeScript中编写一段可归结为此模式的代码:

function test(x: {theFlag: boolean} & {readonly theFlag: boolean} ){
    x.theFlag = true;
}

但是我在这一行x.theFlag = true;

上收到以下错误
  

[ts]无法分配给'theFlag',因为它是常量或只读属性。

我不知道为什么TypeScript会给我一个错误。我认为逻辑上应该允许这样做。

是否有一个很好的解决方法来实现我想要做的事情?

我正在使用TypeScript版本2.7.2。

1 个答案:

答案 0 :(得分:2)

我认为编译器正在安全地播放它,因为该属性只是一种组成类型的readonly,它只是在交集中的readonly。

在2.8中,您可以轻松创建一个从任何属性中删除readonly的类型:

type Mutable<T> = { -readonly [P in keyof T]: T[P]};
function test(x: Mutable<{theFlag: boolean} & {readonly theFlag: boolean}> ){
  x.theFlag = true;
}

在2.7及以下版本中,我认为Mutable的以下定义可以解决问题,我不使用任何2.8语法,但我没有旧版本进行测试:< / p>

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