有没有办法告诉typescript联接类型的元组在以下示例中是否满足任何代码路径的类型约束,而无需在函数体中手动指定每个案例?
type options =
[string, (a:string) => number]
| [number, (b:number) => string ]
function f( [input,fn]: options) {
// Error: Cannot invoke an expression which lacks a call signature
return fn(input)
}
如果input
是string
,那么fn
将接受string
,如果input
是number
,fn
}将接受number
。然而,Typescript认为fn
无法接受输入,因为它认为它是string | number
。
可能的功能是(string) => number | (number) => string
,其中输入为string | number
。如果接受的函数(string|number) => number | (string|number) => string
打字稿就可以了。但我想告诉Typescript,fn
无法接受arg
(这是真的)。
我理解为什么Typescript正在确定各个类型是不兼容的。但我正在寻找一种方法来告诉typescript每个可能的元组都是自包含的,并且可以使用自己的函数调用自己的arg。
答案 0 :(得分:2)
这是一种使其发挥作用的类型安全方式。 as
关键字不是演员,如果类型不兼容, 会抱怨
type options =
[string, (a:string) => number]
| [number, (b:number) => string ]
function f( [input,fn]: options) {
return (fn as (a: string | number) => string | number)(input);
}
TypeScript不够智能,无法自己解决这个问题,因此只需稍微扩大一下这个类型就需要一些帮助。