2016-10-27 2 views
1

Kann jemand erklären, warum der folgende Code in Typoskript kompiliert wird, und wie kann man das im Idealfall verhindern?Zeichenketten sind in Typoskript nicht typgeprüft?

class Foo {} 

function bar(f : Foo) { 
    console.log(f) 
} 

bar("lol wat?") 

EDIT: Dies ist nur eine schnelle Bearbeitung zu erklären, warum ich in dieses Problem lief, um hoffentlich einige zukünftige Menschen etwas Zeit zu sparen. I definiert einen Typ

type Message = MySubMessageType | SomeImportedConfigMessageType 

SomeImportedConfigMessageType durfte ein leeres Objekt sein, und so definiert jede Methode, die ich eine meiner Nachrichten nehmen etwas dauern würde. Bleib auf der sicheren Seite!

+2

sie sind .. es ist nur, dass Ihre Foo-Klasse ist wirklich ein leeres Objekt und kann Ente von irgendetwas getippt werden. :) – toskv

+0

Wenn Sie eine Eigenschaft oder Methode hinzufügen, erhalten Sie auch Fehler. :) – toskv

Antwort

2

Typschrift ist structurally typed.

Sie deklarieren die Methode Bar, um ein Argument vom Typ Foo zu übernehmen.

Ihr Typ Foo enthält keine anderen Einschränkungen, als dass es ein Objekt ist.

Strings sind auch Objekte, daher sind sie kompatibel mit Ihrem Typ Foo.

Es gibt derzeit keine nicht-hacky Möglichkeit, nominale TypScript-Type zu erhalten, aber wenn Sie interessiert sind, können Sie diese github issue ausprobieren.

+0

Hm, string <: leerer Datensatz ... Yay JS Kater. –

Verwandte Themen