Глюк типизации в TypeScript

Oct 12, 2017 09:10


interface A {
}

interface B {
boom(): void
}

function test(fn: (a: A) => void) {
fn({})
}

var a: A = {}

var fn = (b: B) => b.boom();

test(fn)

Ну охуеть теперь. Повод перейти на Flow? хз

typescript

Leave a comment

Comments 5

qvz October 12 2017, 08:21:26 UTC
А в чем глюк? В тс структурная совместимость типов же.
В приведенном примере, интерфейс A будет надтипом любого другого интерфейса.

https://www.typescriptlang.org/docs/handbook/type-compatibility.html

Reply

binf October 12 2017, 11:25:56 UTC
Глюк в том, что A не кастится B ни при каких раскладах, но между
(a: A) => void и
(a: B) => void для тайпскрипта, как выяснилось, разницы нет. Это честно говоря - pizdec. Разумеется, во флоу такой код не компилируется, проверьте.

Reply

qvz October 12 2017, 11:50:13 UTC
А, да, точно. Беру свои слова взад!

Reply

binf October 12 2017, 11:28:32 UTC
ну и если что пример крашится с эксепшеном в строчке test(fn)

Reply


blueher January 22 2018, 05:13:03 UTC
В том-то и дело что с точки зрения TS - A это предок B (потому что структурная совместимость, ага). Добавьте в A какой-то метод - и проблема уйдет.

Reply


Leave a comment

Up