【问题标题】:Restricting an interface to specific keys from a union type将接口限制为联合类型中的特定键
【发布时间】:2021-04-13 04:06:51
【问题描述】:

我有一个联合类型,列出了一些允许的键: type AllowedKeys = "a" | "b";

在其他地方,我正在声明一个接口,我想将此接口限制为允许的键:

interface Interface {
  a: Something; // This is fine
  c: SomethingElse; // I want this to throw an error
}

我如何编写这个来强制接口尊重允许的键?

【问题讨论】:

    标签: typescript typescript-generics union-types


    【解决方案1】:

    interface 无法做到这一点,因为

    这是因为 TypeScript 中的接口是开放式的。这是 TypeScript 的一个重要原则,它允许您使用接口模仿 JavaScript 的可扩展性。

    基本上,您可以随时向界面添加新属性。

    你可以试试

    type AllowedTypes =  {
        "a" : string;
        "b": number ;
    }
    
    type AllowedKeys = keyof AllowedTypes;
    

    【讨论】:

    • 有趣,谢谢。这可以用对象类型来代替吗?
    • 是的!以这种方式思考实际上确实可以让我实现我需要做的事情,谢谢!我现在让问题打开,看看是否有人提出了不同的方法,但这有效。
    • 很高兴它能帮到你
    【解决方案2】:

    如果您不需要将其作为接口并且可以使用 type 代替,请考虑这样做:

    type AllowedKeys = "a" | "b";
    
    export type TestType = {
        [key in AllowedKeys]: Something;
    };
    

    它会强制你在你的类型中使用这两个键 - 不确定这是否是你想要的。例如:

    这会抛出一个错误:

    const a: TestType = {
        a: 'asd',
        b: 'asd',
        c: 'asd'
    }
    

    这很好:

    const a: TestType = {
        a: 'asd',
        b: 'asd',
    }
    

    但这也会引发错误:

    const a: TestType = {
        a: 'asd',
    }
    

    如果您不关心是否使用了所有允许的键,只需在类型声明中使用 ?

    export type TestType = {
        [key in AllowedKeys]?: string;
    };
    

    【讨论】:

    • 我确实尝试过这条路线,如果每个键都具有相同的类型,它就可以工作。就我而言,我需要每个键都有不同的特定类型
    • 有道理,那么此响应不适合您的情况:)
    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2021-12-02
    • 2019-03-26
    • 2021-08-17
    • 2021-08-10
    • 1970-01-01
    • 2022-06-16
    相关资源
    最近更新 更多