如何在TypeScript中检查一个字符串是否是特定接口的属性

3

我有一个现实世界的情况,需要使用字符串字面量来引用属性。我希望能够使其类型安全,在TypeScript中应该是可能的。考虑以下简化示例:

interface MyInterface {
    foo: string,
}

const barName = <keyof MyInterface>'bar'    // No error?
const bazName = 'baz' as keyof MyInterface  // No error?
const bopName:keyof MyInterface = 'bop' // Finally, an error!

我认为答案是TypeScript中的<>as操作是"类型断言"而不是"类型转换尝试"。上面的前两个常量基本上是在说:"相信我,这是MyInterface的一个键",而第三个常量则是尝试进行类型赋值,并且失败了。
我想知道我的理解是否正确,如果是,是否有其他内联方式来测试字符串字面量是否是给定接口的键,而不需要创建一个临时变量。
1个回答

2

你对前两个 const 声明没有出现错误的原因是正确的。

如果在变量上没有显式类型注释,唯一导致出错的方法是使用助手函数:

interface MyInterface {
    foo: string,
}
const key = <T>(o: keyof T) => o;
const barName = key<MyInterface>('bar')    // error
const fooName = key<MyInterface>('foo')    // ok

您也可以保留const声明不变,const将被类型化为与字符串字面量相关联的字符串字面量类型。第一次使用它来索引MyInterafce实例时,您将收到一个错误,尽管这可能并非在所有情况下都适用。


谢谢。该函数是一个很好的解决方案,并具有所需的编译时效果。不幸的是,它在编译过程中不会消失,最终会成为JavaScript中的函数调用。对于那些对性能影响感兴趣的人,关于这种简单函数运行时性能的相关讨论可以在GitHub上找到(https://github.com/Microsoft/TypeScript/issues/661#issuecomment-374473607)。 (tl;dr:对性能没有任何影响) - Nimai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接