typescript - Typeof/instanceof typalias
Jag undrar om det är möjligt att bestämma typen av ett objekt i TypeScript. Vänligen se exemplet nedan:
type T = [number, boolean];
class B {
foo: T = [3, true];
bar(): boolean {
return this.foo instanceof T;
}
}
Operatorn typeof verkar inte vara en lösning, inte heller instanceof.
Svar #1
Kort svar
(Nästan) all typinformation tas bort efter kompilering, och du kan inte använda instanceof-operatorn med ett operand (T i ditt exempel) som inte existerar vid körning.
Långt svar
En identifierare i TypeScript kan tillhöra en eller flera av följande grupper: typ, värde, namnrymd. Det som skickas ut som JavaScript är identifierare i gruppen värde.
Således fungerar runtime-operatorer endast med värden. Så om du vill göra typkontroll vid körning av värdet på foo måste du göra det hårda arbetet själv.
Se avsnittet om deklarationssammanfogning i TypeScript-handboken för mer information.
Svar #2
För att lägga till på @vilcvane's svar: types och interfaces försvinner under kompilering, men viss klass-information finns fortfarande tillgänglig. Så, till exempel, fungerar inte detta:
interface MyInterface { }
var myVar: MyInterface = { };
// compiler error: Cannot find name 'MyInterface'
console.log(myVar instanceof MyInterface);
Men detta gör det:
class MyClass { }
var myVar: MyClass = new MyClass();
// this will log "true"
console.log(myVar instanceof MyClass);
Det är dock viktigt att notera att den här typen av test kan vara vilseledande, även när din kod kompilerar utan fel:
class MyClass { }
var myVar: MyClass = { };
// no compiler errors, but this logs "false"
console.log(myVar instanceof MyClass);
Detta är logiskt om du tittar på hur TypeScript genererar utdata JavaScript i var och en av dessa exempel.
