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!这种想法确实让我实现了我需要做的事情,谢谢!我现在就让这个问题继续讨论,看看是否有人提出了不同的方法,但这是可行的。很高兴这对你有帮助。我确实尝试过这一方法,如果每个键都有相同的类型,它就会起作用。在我的情况下,我需要每个键都有一个不同的、特定的类型。如果有意义,那么这个回答不适合您的情况:)