【问题标题】:Changing a property modifier when merging an interface合并接口时更改属性修饰符
【发布时间】:2023-03-06 04:43:01
【问题描述】:

Window 接口有一些只读属性:

interface Window extends ... {
  // ...
  readonly innerHeight: number;
  readonly innerWidth: number;
  // ...
}

我知道那些不能真正改变,但在我的单元测试中,我正在改变对象的值来模拟改变。它就是那种类型的对象。

有没有一种方法可以在自定义 d.ts 文件中增加该类型并更改这些属性修饰符?

我试图用这个创建一个 .d.ts 文件:

interface Window {
  innerHeight: number;
  innerWidth: number;
}

但是编译器抱怨:

'innerWidth' 的所有声明必须具有相同的修饰符。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    (我很确定)不,您不能更改现有类型的修饰符或类型。

    但是由于您只是将其用于测试,因此将其转换为任何对象应该没有问题:

    (window as any).innerWidth = 500;
    (window as any).innerHeight = 300;
    

    编辑

    有一个技巧可以让类型可变:

    type Mutable<T extends { [x: string]: any }, K extends string> = {
        [P in K]: T[P];
    }
    
    type MyWindow = Mutable<Window, keyof Window>;
    (window as MyWindow).innerWidth = 500;
    (window as MyWindow).innerHeight = 300;
    

    (code in playground)

    在这个问题中建议:Mapped Types syntax to remove modifiers,但如果它是为了测试,那么这可能是一种矫枉过正的做法,而转换为 any 就可以解决问题(在我看来)。

    【讨论】:

    • 不应该,我只是希望不要来。
    • 你能解释为什么它有效而不是 [P in keyof T]: T[P] ??
    • 正如我问题中的链接中所解释的那样,您需要“打破同态关系”并且要做到这一点,您需要“一组不同的键”
    猜你喜欢
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 2018-06-13
    • 2013-10-19
    • 2022-07-21
    相关资源
    最近更新 更多