Вызов союзов типов функций в TypeScript - PullRequest
0 голосов
/ 03 сентября 2018

В 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());

код на typescriptlang.org

Я ожидал, что тип f будет function f(): {left:String; right:String} => String или эквивалентным (например, проверка типов в Scala сообщает о таком типе).

Однако я получил следующую ошибку типа:

./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 -состояние?

1 Ответ

0 голосов
/ 03 сентября 2018

Просто аннотируйте возвращаемый тип f, и компилятор увидит, что каждая возвращаемая функция совместима с этим типом:

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