在TypeScript中调用函数类型的联合

在TypeScript中调用函数类型的联合,typescript,subtyping,structural-typing,union-types,Typescript,Subtyping,Structural Typing,Union Types,在TypeScript 3.0.3中,以下代码将给出编译时错误: function f() { if (true) { return (x: {left:String}) => x.left; } else { return (x: {right:String}) => x.right; } } class C { left: String = ""; right: String = ""; } f()(ne

在TypeScript 3.0.3中,以下代码将给出编译时错误:

function f() {
    if (true) {
        return (x: {left:String}) => x.left;
    } else {
        return (x: {right:String}) => x.right;
    }
}

class C {
    left: String = "";
    right: String = "";
}

f()(new C());
我希望f的类型是函数f:{left:String;right:String}=>String或等效的函数。例如,Scala typechecker报告这样的类型

但是,我得到了以下类型错误:

./leftright.ts:17:1 - error TS2349: Cannot invoke an expression whose type lacks a call signature. Type '((x: { left: String; }) => String) | 
((x: { right: String; }) => String)' has no compatible call signatures.

17 f()(new C());
函数类型的并集似乎不可直接调用,尽管我们可以在对象类型的并集中引用字段


有没有办法将f修改为可调用的,同时在其中保留if语句

只需注释f的返回类型,编译器就会看到您返回的每个函数都与该类型兼容:

function f(): (x: { left: String, right: String }) => String {
    if (true) {
        return (x: {left:String}) => x.left;
    } else {
        return (x: {right:String}) => x.right;
    }
}
相关GitHub问题: