在TypeScript 4.4.3中,我如何才能导致下面的不正确字符串'c'
显示类型错误(因为它不是对象的键之一,是doSomething
方法的第一个参数)?
const doSomething = ({ a, b }: { a: number, b: string }): boolean => {
return a === 1 || b === 'secret'
}
type SomethingParameterName = keyof Parameters<typeof doSomething>[0]
const orderedParameterNames = [
'b', 'c', 'a' // why no type error for 'c'?
] as SomethingParameterName[]
参见TypeScript Playground。
我玩了const
一点,并直接尝试了'c' as SomethingParameterName
,但也没有类型错误。在这种情况下,我没有一种简单的方法从函数本身以外的其他来源获取键列表。
TypeScript结构as TypeName
本质上是一个类型强制转换。因为const字符串联合的基类型是string
, TypeScript接受这种类型强制转换作为兼容的类型断言。要获得预期的错误,定义变量orderedParameterNames
的类型,而不是强制转换分配给它的值:
const orderedParameterNames: SomethingParameterName[] = [
'b', 'c', 'a'
]
现在会在'c'
上给出一个错误:
TS2322:类型'"c"'不能赋值给类型'"a"|"b".