我确实有一个实际情况,我需要使用字符串文字按名称引用属性。我想使它成为类型安全的,并且感觉像在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
操作是“类型断言”而不是“类型强制转换尝试”。上面的前两个const基本上是说:“相信我,这 是MyInterface的键”,而第三个const则尝试进行类型化分配并失败。
我想知道我是否正确,如果是这样,是否还有其他内联方法可以测试字符串文字是否是给定接口的键,而无需创建临时变量。
答案 0 :(得分:1)
对于在前两个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
的实例,尽管这可能不适用于所有情况。