@LukeJL:
brak jawnego pisania typów w kodzie pozwala na elastyczność w przypadku zmiany zdania - chociaż bardziej mam na myśli typowanie na poziomie całych obiektów, np. duck typing (obiekty nie mają jawnie zdefiniowanych interfejsów/typów, ale każdy obiekt można uznać za obiekt dowolnej "klasy" - wystarczy, że będzie miał w sobie odpowiednie metody/właściwości, których potrzebujemy), albo możliwość dodania/usuwania właściwości i metod z obiektów na żywca.
Jak masz odpowiedi system typów to możesz mieć i to i to - wszystko otypowane i jednocześnie elastyczne, w przypadku JS zarówno TS jak i Flow mają typy strukturalne, czyli taki automatyczny duck-typing, przykład we Flow:
// @flow
type FooBar = {
foo: string,
bar: string
}
class Example {
foo: string
bar: string
baz: string
constructor(foo: string, bar: string, baz: string) {
this.foo = foo
this.bar = bar
this.baz = baz
}
}
class AnotherExmple {}
function doSomething (obj: FooBar) {
return JSON.stringify(obj, null, '\t')
}
const result1 = doSomething({ foo: 'elo', bar: 'yo' }) // ok
const result2 = doSomething({ foo: 'elo', bar: 'yo', baz: 'hello' }) // ok
const result3 = doSomething(new Example('elo', 'yo', 'hello')) // ok
const result4 = doSomething({ foo: 'elo' }) // typechecker error
const result5 = doSomething(new AnotherExmple()) // typechecker error
console.log(
result1,
result2,
result3
)
w TS będzie delikatnie inaczej (trzeba jawnie zezwolić na dodatkowe pola, dodając indekser, cała reszta identyczna):
type FooBar = {
foo: string,
bar: string,
[key: string]: any
}
Wydaje mi się, że hejtujesz statyczne typowanie bo nie znasz wszyskich zalet i opcji jakie masz.