2017-12-05 1 views
0

Ich schreibe einige Unit Tests mit Jasmin. Wenn ich benutze:"as string" versus toString()

let arg0 : string = http.put.calls.argsFor(0) as string; 
if(arg0.search(... 

dann bekomme ich die Fehler arg0.search keine Funktion ist. Intellisense zeigt, dass arg0 ein Array und nicht wie erwartet eine Zeichenfolge ist. Wenn ich stattdessen verwende:

let arg0 : string = http.put.calls.argsFor(0).toString(); 
if(arg0.search(... 

es funktioniert. Intellisense zeigt, dass die argsFor-Funktionssignatur als Rückgabetyp einen beliebigen Wert hat. Wenn es aufgerufen wird, wird ein Array zurückgegeben.

Warum funktioniert die "as string" -Version nicht und warum bekomme ich keinen Kompilierfehler, wenn arg0 in diesem Fall ein Array anstelle einer Zeichenfolge enthält?

Antwort

3

as string ist ein TypeScript-Konstrukt, da es entfernt wird, wenn es kompiliert wird, so dass Javascript nicht einmal davon weiß.

toString() ist eine JavaScript-Methode, die tatsächlich übernimmt, was in der vorherigen Methode zurückgegeben wird, und es in eine Zeichenfolge konvertiert. Dies wird zur Kompilierzeit nicht entfernt.

+0

Also, was Sie sagen, ist, dass, wenn ich Typ-Informationen in Typoskript mich angeben, können die Transpiler nicht immer festzustellen, ob es tatsächlich richtig ist, im Gegensatz zu Sprachen wie C#; Java? – pere57

+0

@ pere57 typescript existiert nur zur Kompilierzeit. Also - du kannst es nicht mit IL oder JVM Bytecodes vergleichen, richtig. – zerkms

+0

@zerkms Ich sehe. In TypeScript ist "as" nur eine Typassertion, die dem TypeScript-Compiler hilft, den Code zu analysieren. Es ändert nicht wirklich die Variable, auf die es angewendet wird. Auf der anderen Seite ist das C# "as" ein Operator und führt zur Laufzeit eine Typumwandlung durch. – pere57