当字符串与对象的键不匹配时强制类型错误



在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".

相关内容

最新更新