我正在尝试在TypeScript中编写一段可归结为此模式的代码:
function test(x: {theFlag: boolean} & {readonly theFlag: boolean} ){
x.theFlag = true;
}
但是我在这一行x.theFlag = true;
[ts]无法分配给'theFlag',因为它是常量或只读属性。
我不知道为什么TypeScript会给我一个错误。我认为逻辑上应该允许这样做。
是否有一个很好的解决方法来实现我想要做的事情?
我正在使用TypeScript版本2.7.2。
答案 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>;