В функции объединения Typescript отсутствует подпись вызова - PullRequest
0 голосов
/ 17 ноября 2018
interface F1 {
  (a, b): any;
}

interface F2 {
  (a): any;
}

type F3 = F1 | F2;

const f: F3 = (a) => {
  console.log(123, a);
}

f(1) // Error

Я наткнулся на одну из загадочных проблем в TypeScript (3.1.4). Пока я звоню f(), компилятор говорит Cannot invoke an expression whose type lacks a call signature. Type 'F3' has no compatible call signatures. [2349].

Это даже странно, так как весь вышеприведенный код работает до тех пор, пока f(1).

Я что-то здесь упускаю? Если таковые имеются, как я могу дать типизированную функцию union?

Я знаю, что могу сделать что-то подобное

interface T {
  (a, b): any;
  (a): any;
}

Но тогда я должен определить функцию таким образом

function (a, b?) {

}

который мне не очень нравится. Любая помощь / обратная связь будет оценена.

1 Ответ

0 голосов
/ 17 ноября 2018

В машинописном тексте оператор | описывает тип объединения :

Тип объединения описывает значение, которое может быть одним из нескольких типов. Мы используем вертикальную черту (|) для разделения каждого типа, поэтому число | строка | логическое значение - это тип значения, которое может быть числом, строкой или логическим значением.

interface F1 {
  (a, b): any;
}

interface F2 {
  (a): any;
}

type F3 = F1 | F2;
const f: F3 = (a) => {
  console.log(123, a);
}

const isF2 = (a): a is F2 => true; // Typeguard
if (isF2(f)) { 
  f(1); // OK
}

Вы ищете оператор & или тип пересечения :

interface F1 {
  (a, b): any;
}

interface F2 {
  (a): any;
}

type F4 = F1 & F2;
const g: F4 = (a) => {
  console.log(123, a);
}

g(1); // OK

С этими примерами можно поиграть на этой площадке для машинописи

...