function isString(test: any): test is string{
return typeof test === "string";
}
function example(foo: any){
if(isString(foo)){
console.log("it is a string" + foo);
console.log(foo.length); // string function
}
}
example("hello world");
Wenn Sie das Typprädikat "test is string" im obigen Format verwenden (anstatt nur boolean für den Rückgabetyp zu verwenden, wird TypeScript nach dem Aufruf von isString () den Typ auf Zeichenfolge in einem von a geschützten Block eingrenzen Aufruf der Funktion.
Der Compiler wird denken, dass foo eine Zeichenfolge im untergeschützten Block ist (und NUR im untergeschützten Block).
{
console.log("it is a string" + foo);
console.log(foo.length); // string function
}
Das Typprädikat wird nur zur Kompilierungszeit verwendet. Die Ergebnis-JS-Datei (Laufzeit) hat keinen Unterschied, da der TYP nicht berücksichtigt wird.
Ich werde die Unterschiede in den folgenden vier Beispielen veranschaulichen.
Beispiel 1: Der obige Beispielcode weist keinen Kompilierungs- und Laufzeitfehler auf.
Beispiel 2: Der folgende Beispielcode weist einen Kompilierungsfehler (sowie einen Laufzeitfehler) auf, da TypeScript den Typ auf Zeichenfolge eingegrenzt und überprüft hat, dass toExponential nicht zur Zeichenfolgenmethode gehört.
function example(foo: any){
if(isString(foo)){
console.log("it is a string" + foo);
console.log(foo.length);
console.log(foo.toExponential(2));
}
}
Beispiel 3: Der folgende Beispielcode hat keinen Kompilierungsfehler, aber einen Laufzeitfehler, da TypeScript den Typ NUR auf eine Zeichenfolge im geschützten Block eingrenzt, jedoch nicht danach. Daher erstellt foo.toExponential keinen Kompilierungsfehler (TypeScript glaubt nicht, dass dies der Fall ist) ein String-Typ). Zur Laufzeit verfügt die Zeichenfolge jedoch nicht über die Methode toExponential, sodass ein Laufzeitfehler auftritt.
function example(foo: any){
if(isString(foo)){
console.log("it is a string" + foo);
console.log(foo.length);
}
console.log(foo.toExponential(2));
}
Beispiel 4: Wenn wir nicht "test is string" (Typprädikat) verwenden, wird TypeScript den Typ im geschützten Block nicht eingrenzen und der folgende Beispielcode hat keinen Kompilierungsfehler, aber einen Laufzeitfehler.
function isString(test: any): boolean{
return typeof test === "string";
}
function example(foo: any){
if(isString(foo)){
console.log("it is a string" + foo);
console.log(foo.length);
console.log(foo.toExponential(2));
}
}
Die Schlussfolgerung ist, dass "test is string" (Typprädikat) in der Kompilierungszeit verwendet wird, um den Entwicklern mitzuteilen, dass der Code möglicherweise einen Laufzeitfehler aufweist. Bei Javascript kennen die Entwickler den Fehler in der Kompilierungszeit nicht. Dies ist der Vorteil der Verwendung von TypeScript.
booleanoder?