强制转换为“ keyof T”是否起作用或导致编译错误?

时间:2018-07-31 13:25:01

标签: visual-studio typescript visual-studio-code

考虑以下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建议:

keyof cast - intellisense suggestions

const myVar: keyof MyInterface = "Prop4";显然可以按预期工作并抛出错误,但是第一个示例既不抛出错误,也不保证类型安全。

此声明合法吗?如果是这样,应该如何表现?如果没有,为什么要编译?

1 个答案:

答案 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");

Playground link