molily: TypeScript? Wozu? Isses wirklich "besser"?

Beitrag lesen

Als jemand der Typisierung schätzt geht mir PHP eben zu sehr in die Richtung: mach mal drauf los, du kannst versuchen alles überall reinzustecken und auszulesen, *irgendwas* wird schon passieren.

Du könntest ja Hack schreiben. ;) PHP mit Typangaben.

Da ist es (für mich) unverzeichtbar wenn IDE und Compiler mir bereits sagen können ob es eine Variable überhaupt gibt, welchen Typ sie hat, welche Eigenschaften sie hat, oder mir sagen kann hey es gibt hier keine Eigenschaft namens "coment" weil ich ein m vergessen habe - was ja alles nur geht wenn der Typ feststeht.

Naja… Solche trivialen Dinge kann jede halbwegs gute PHP-IDE. Typinferenz ist auch bei dynamisch typisierten Sprachen möglich.

$foo = new Bar();  
$foo->quux();

Jede gute PHP-IDE weiß hier, dass $foo eine Variable vom Typ Bar ist. Sie liest die Klassendeklaration von Bar ein, sucht »quux« in den dort deklarierten Methoden und zeigt ggf. eine Warnung an.

Das ist jetzt ein triviales Beispiel, aber heutige Typinferenz-Algorithmen sind äußerst leistungsfähig.

Hab ich jetzt eine Zahl oder einen String? Kann ich das so ausgeben oder muss ich es formatieren? Kann ich damit rechnen weil gilt 2 * 5.5 = 11 oder steht noch 5,5 (mit Komma) drin und bei der Berechnung zählt das als 55 oder als gar keine gültige Zahl?

Das ist weniger eine Frage von statischer vs. dynamischer Typisierung, sondern von starker vs. schwacher Typisierung. Oder auch einfach gutem vs. schlechtem Sprachdesign. ;)

Natürlich ist PHP hinsichtlich Operatoren, Typecasting und Fehler grässlich, auch JavaScript hat viele Fallstricke. Andere dynamisch typisierte Sprachen sind da strenger:

$ php -r "echo 2 * '5.5';"
11

$ node -e "console.log(2 * '5.5');"
11

$ ruby -e "puts 2 * '5.5';"
-e:1:in \*': String can't be coerced into Fixnum (TypeError) from -e:1:in <main>'

$ ruby -e "puts 2 * '5.5'.to_f;"
11.0

$ ruby -e "puts '5.5' * 2;"
5.55.5

$ python -c "print 2 * '5.5'"
5.55.5

Dass ein Komma im String sein kann, musst du in sämtlichen Sprachen antizipieren, sonst kommt ggf. unerwünschtes heraus:

$ php -r "echo floatval('5,5');"
5

$ ruby -e "puts '5,5'.to_f;"
5.0

$ node -e "console.log(Number('5,5'));"
NaN

$ node -e "console.log(parseFloat('5,5'));"
5

$ python -c "print float('5,5')"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ValueError: invalid literal for float(): 5,5

Die Regeln der Umwandlung von String in Floats sind in allen Sprachen dokumentiert und vorhersehbar.

Mathias