【发布时间】:2017-01-21 02:32:27
【问题描述】:
有没有办法告诉 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。
【问题讨论】:
-
对我来说似乎是正确的行为?
f接受一个元组,你想给它一个字符串还是一个数字? -
你的意思是递归调用,应该
f(input)befn(input)? -
我认为他是的,因为最后一段提到
fn而不是f。这不是问题中的错字,因为他得到的错误是您调用f时会得到的错误。我修改了我的答案以反映这一意图。由于一些相当复杂的类型理论,修复该错误仍然会失败。我想知道这是一个玩具示例,还是您真正想要使用的东西? -
这是我想用来键入调用 REST 端点可能接受的参数的东西。 @SimonMeskens
标签: typescript functional-programming tuples