我试着用typescript编写一段代码,可以归结为以下模式:

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

但我在这行得到了以下错误x.theFlag = true;
[ts]不能赋给'theflag',因为它是常量或只读属性。
我不知道为什么typescript在这个问题上给了我一个错误。我认为从逻辑上讲这应该是允许的。
有没有一个很好的解决办法来实现我的目标?
我使用的是Typescript版本2.7.2。

最佳答案

我认为编译器是安全的,因为属性在一个组成类型中是只读的,所以它在交集中是只读的。
在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语法,但我没有旧版本可供测试:
type MutableHelper<T, TNames extends string> = { [P in TNames]: (T & { [name: string]: never })[P]};
type Mutable<T> = MutableHelper<T, keyof T>;

关于typescript - TypeScript交集类型和只读属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49638155/

10-10 05:35