Утверждение типа возвращаемого значения или тип возвращаемого значения функции ввода - PullRequest
0 голосов
/ 23 апреля 2020

Каковы различия (если они есть) между типом, утверждающим возвращаемое значение функции, и типизирующим функцию возвращаемое значение в ее типе подписи? Предположим, мы говорим только о простых функциях с одним оператором return.

interface Foo { foo: number }

interface Bar { bar: Foo[] }

// type assertion
function buzz(foo: Foo) {
  return { bar: [] } as Bar;
}

// typing the function
function fuzz(foo: Foo): Bar {
  return { bar: [] };
}

См. Пример TypeScript Playground .

1 Ответ

0 голосов
/ 23 апреля 2020

В этом случае нет, так как логический вывод просто вводит fuzz и buzz как (foo: Foo) => Bar. Вы можете увидеть разницу, т.е. если вы попытаетесь добавить другое условие if перед последним возвратом, с другим возвратом:

interface Foo { foo: number }

interface Bar { bar: Foo[] }

// type assertion
function buzz(foo: Foo) {
  // This changes the return type of `buzz` to Bar | object
  if (foo.foo > 10) return {};
  return { bar: [] } as Bar;
}

// typing the function
function fuzz(foo: Foo): Bar {
  // This is a type error, since `fuzz` expects a `Bar` as return type
  if (foo.foo > 10) return {};
  return { bar: [] };
}

В первом случае адаптируется buzz. Во втором коде fuzz код выдает ошибку.

Разница здесь в том, что форсирование Bar в качестве возвращаемого типа означает: «Я объявляю вывод, так что кто будет реализовывать это, должен уважайте вывод, Бар ". Использование as Bar в качестве возвращаемого типа говорит: «Хорошо, сейчас это возвращает объект, но я уверен, что вывод должен быть Bar. В любом случае, при любом изменении мы должны соответственно изменить тип возвращаемого значения».

...