Typescript 将接口限制为来自联合类型的特定键

Typescript 将接口限制为来自联合类型的特定键,typescript,typescript-generics,union-types,Typescript,Typescript Generics,Union Types,我有一个联合类型,列出了一些允许的键: 键入AllowedKeys=“a”|“b” 在其他地方,我正在声明一个接口,我想将此接口限制为允许的键: interface Interface { a: Something; // This is fine c: SomethingElse; // I want this to throw an error } 我如何编写此代码来强制接口遵守允许的键?您不能使用它,因为 这是因为TypeScript中的接口是开放式的。这是TypeScript的

我有一个联合类型,列出了一些允许的键:
键入AllowedKeys=“a”|“b”

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

interface Interface {
  a: Something; // This is fine
  c: SomethingElse; // I want this to throw an error
}
我如何编写此代码来强制接口遵守允许的键?

您不能使用它,因为

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

基本上,您总是可以向接口添加新属性

相反,你可以试试看

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

type AllowedKeys = keyof AllowedTypes;

如果你不需要这个是一个接口,你可以使用类型来考虑这样做:

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;
};

很有趣,谢谢。这可以用对象类型来代替吗?@Clementiol,请参阅更新的答案Yes!这种想法确实让我实现了我需要做的事情,谢谢!我现在就让这个问题继续讨论,看看是否有人提出了不同的方法,但这是可行的。很高兴这对你有帮助。我确实尝试过这一方法,如果每个键都有相同的类型,它就会起作用。在我的情况下,我需要每个键都有一个不同的、特定的类型。如果有意义,那么这个回答不适合您的情况:)