元组联合类型的控制流分析

时间:2016-09-13 13:06:16

标签: typescript functional-programming tuples

有没有办法告诉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)
}

如果inputstring,那么fn将接受string,如果inputnumberfn }将接受number。然而,Typescript认为fn无法接受输入,因为它认为它是string | number

可能的功能是(string) => number | (number) => string,其中输入为string | number。如果接受的函数(string|number) => number | (string|number) => string打字稿就可以了。但我想告诉Typescript,fn无法接受arg(这是真的)。​​

我理解为什么Typescript正在确定各个类型是不兼容的。但我正在寻找一种方法来告诉typescript每个可能的元组都是自包含的,并且可以使用自己的函数调用自己的arg。

1 个答案:

答案 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不够智能,无法自己解决这个问题,因此只需稍微扩大一下这个类型就需要一些帮助。