В этом случае нет, так как логический вывод просто вводит 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. В любом случае, при любом изменении мы должны соответственно изменить тип возвращаемого значения».