考虑以下TypeScript示例:
interface MyInterface{
Prop1: string;
Prop2: number;
Prop3: string;
}
const myVar = "Prop4" as keyof MyInterface;
在Visual Studio 2017,Visual Studio Code和Playground中运行此代码成功编译(TypeScript 2.9.2);不会根据MyInterface
对字符串值进行类型检查,但是VS和VSC都将MyInterface
的3个属性显示为IntelliSense建议:
const myVar: keyof MyInterface = "Prop4";
显然可以按预期工作并抛出错误,但是第一个示例既不抛出错误,也不保证类型安全。
此声明合法吗?如果是这样,应该如何表现?如果没有,为什么要编译?
答案 0 :(得分:2)
您使用的是类型断言,根据开发人员的判断,按定义定义的类型断言会覆盖编译器对您所知的真实情况。如果您告诉编译器该字符串不是MyInterface
的键,而是MyInterface
的键,它将接受设计的目的(尽管这样做会阻止您在不相关的类型之间断言,例如,这将是错误:let d = true as keyof MyInterface;
)。
如果希望将变量键入为接口的键,但仍检查分配给它的值是否有效,则可以根据需要显式指定类型。
您还可以使用辅助功能:
interface MyInterface {
Prop1: string;
Prop2: number;
Prop3: string;
}
function keyOf<T>(key: keyof T) {
return key;
}
const myVar = keyOf<MyInterface>("Prop4"); //Argument of type '"Prop4"' is not assignable to parameter of type '"Prop1" | "Prop2" | "Prop3"'.
const myVar2 = keyOf<MyInterface>("Prop3");