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.

Relaterade artiklar