TypeScript: преобразовать тип 'a |b 'to' a 'на основе typeof - PullRequest
1 голос
/ 22 октября 2019

Я новичок в TypeScript и пытаюсь понять, как можно использовать приведение типов. Я работаю с API, который определяет функцию, подобную следующей:

function foo(a: number): number | undefined;

Я хочу выполнить функцию для возвращаемого значения этого числа, чтобы всегда безопасно преобразовывать его в число, но я получаюошибка:

function myFunc(bar: number | undefined): number {
  if (typeof bar === undefined) {
    return 0;
  } else {
    return bar; // error ts(2322)
  }
}

Где ts(2322) расширяется до Type 'number | undefined' is not assignable to type 'number'. Type 'undefined' is not assignable to type 'number'.

Мне кажется, что это то, что должно быть определено во время компиляции. Ясно, что мы обращаемся только к else, если typeof bar === number, но пробуем это в следующем фрагменте кода:

function myFunc(bar: number | undefined): number {
  if (typeof bar === number) { // error ts(2367)
    return bar;
  } else {
    return 0;
  }
}

Сообщение об ошибке: This condition will always return 'false' since the types '"string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function"' and 'Requireable<number>' have no overlap.

На данный момент я довольнопотерял на том, что возможно с приведением в TypeScript. Есть ли способ достичь моих целей? Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

3 голосов
/ 22 октября 2019
if (typeof bar === undefined) {

Оператор * typeof создает строку, поэтому вы должны действительно протестировать:

if (typeof bar === "undefined") {

Как вы уже поняли, случай if будетникогда не будет истиной, поэтому код всегда входит в блок else. Таким образом, Typescript выводит, что оператор return может быть достигнут с bar, все еще неопределенным, что противоречит типу, который, как вы сказали, вы возвращаете.

0 голосов
/ 22 октября 2019

Николас дает подробное объяснение, но вы наверняка могли бы реализовать свою функцию просто как:

function myFunc(bar: number | undefined): number {
    return bar || 0;
}
...