Livejournal
Log in
Post
Friends
My journal
binf
Глюк типизации в 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
Comments 5
В приведенном примере, интерфейс A будет надтипом любого другого интерфейса.
https://www.typescriptlang.org/docs/handbook/type-compatibility.html
Reply
(a: A) => void и
(a: B) => void для тайпскрипта, как выяснилось, разницы нет. Это честно говоря - pizdec. Разумеется, во флоу такой код не компилируется, проверьте.
Reply
Reply
Reply
Reply
Leave a comment