TypeScript
Benutzerdefinierte Typenschutz
Suche…
Syntax
- typeof x === "Typname"
- x Instanz von TypeName
- Funktion (foo: any): foo ist TypeName {/ * code und liefert boolesche Werte * /}
Bemerkungen
Bei der Verwendung von Typanmerkungen in TypeScript-Einschränkungen müssen die möglichen Typen behandelt werden, mit denen Ihr Code umgehen muss. Es ist jedoch weiterhin üblich, verschiedene Codepfade zu verwenden, die auf dem Laufzeittyp einer Variablen basieren.
Mit Typwächtern können Sie Code schreiben, der auf Grundlage des Laufzeittyps einer Variablen unterscheidet. Dabei bleiben Sie stark typisiert und vermeiden Umwandlungen (auch als Typassertionen bezeichnet).
Instanceof verwenden
instanceof
setzt instanceof
, dass die Variable den Typ any
.
Dieser Code ( probiere es ):
class Pet { }
class Dog extends Pet {
bark() {
console.log("woof");
}
}
class Cat extends Pet {
purr() {
console.log("meow");
}
}
function example(foo: any) {
if (foo instanceof Dog) {
// foo is type Dog in this block
foo.bark();
}
if (foo instanceof Cat) {
// foo is type Cat in this block
foo.purr();
}
}
example(new Dog());
example(new Cat());
druckt
woof
meom
zur Konsole.
Mit typeof
typeof
wird verwendet, wenn Sie zwischen den Typen number
, string
, boolean
und symbol
. Andere String-Konstanten werden nicht fehlerhaft sein, werden aber auch nicht zum Einschränken von Typen verwendet.
Im Gegensatz zu instanceof
arbeitet typeof
mit einer beliebigen Variable. Im folgenden Beispiel könnte foo
als number | string
eingegeben werden number | string
ohne Ausgabe.
Dieser Code ( probiere es ):
function example(foo: any) {
if (typeof foo === "number") {
// foo is type number in this block
console.log(foo + 100);
}
if (typeof foo === "string") {
// fooi is type string in this block
console.log("not a number: " + foo);
}
}
example(23);
example("foo");
druckt
123
not a number: foo
Typüberwachungsfunktionen
Sie können Funktionen, die als Typenwächter dienen, mit einer beliebigen Logik deklarieren.
Sie nehmen die Form an:
function functionName(variableName: any): variableName is DesiredType {
// body that returns boolean
}
Wenn die Funktion true zurückgibt, wird der Typ von DesiredType
in jedem Block, der von einem Aufruf der Funktion überwacht wird, auf DesiredType
.
Zum Beispiel ( probiere es ):
function isString(test: any): test is string {
return typeof test === "string";
}
function example(foo: any) {
if (isString(foo)) {
// foo is type as a string in this block
console.log("it's a string: " + foo);
} else {
// foo is type any in this block
console.log("don't know what this is! [" + foo + "]");
}
}
example("hello world"); // prints "it's a string: hello world"
example({ something: "else" }); // prints "don't know what this is! [[object Object]]"
Ein Prädikat für einen Funktionstyp eines Guard (das foo is Bar
in der Funktion return type position) wird zur Kompilierzeit verwendet, um Typen einzuengen. Das Typ-Prädikat und die Funktion müssen übereinstimmen, sonst funktioniert Ihr Code nicht.
Type-Guard-Funktionen müssen nicht typeof
oder instanceof
, sie können eine kompliziertere Logik verwenden.
Dieser Code bestimmt beispielsweise, ob Sie ein jQuery-Objekt haben, indem Sie nach der Versionszeichenfolge suchen.
function isJQuery(foo): foo is JQuery {
// test for jQuery's version string
return foo.jquery !== undefined;
}
function example(foo) {
if (isJQuery(foo)) {
// foo is typed JQuery here
foo.eq(0);
}
}