Как использовать instanceof с типом функции generi c - PullRequest
0 голосов
/ 03 мая 2020

В следующем примере я хотел бы убедиться, что возвращаемый тип соответствует данному типу generi c в функции generi c. К сожалению, при использовании result instanceof T TypeScript сообщает о следующей ошибке: error TS2693: 'T' only refers to a type, but is being used as a value here. Есть ли способ проверить во время выполнения, соответствует ли тип объекта универсальному типу c?

class Foo {
    id: number;
    constructor(id: number) {
        this.id = id;
    }
}

class Bar extends Foo {
    name: string;
    constructor(id: number, name: string) {
        super(id);
        this.name = name;
    }
}

function get<T>(list: Array<Foo>, id: number): T|undefined {
    const result = list.find(e => e.id === id);
    if (typeof result === 'undefined') {
        return undefined;
    }

    if (!(result instanceof T)) { // error TS2693: 'T' only refers to a type, but is being used as a value here 
        return undefined;
    }

    return result as unknown as T;
}

const foos = [new Foo(1), new Bar(2, 'bar'), new Foo(3)];

console.log(get<Foo>(foos, 1));
console.log(get<Foo>(foos, 2));
console.log(get<Bar>(foos, 3));

1 Ответ

1 голос
/ 03 мая 2020

Типы (и параметры типов) стираются во время компиляции, поэтому вы не можете сказать result instanceof T, потому что во время выполнения нет T.

Что вы можете сделать, это передать сам класс в функция (которая является значением и, таким образом, может использоваться во время выполнения)


function get<T>(cls: new (...a: any) => T, list: Array<Foo>, id: number): T|undefined {
    const result = list.find(e => e.id === id);
    if (typeof result === 'undefined') {
        return undefined;
    }

    if (!(result instanceof cls)) {
        return undefined;
    }

    return result as unknown as T;
}

const foos = [new Foo(1), new Bar(2, 'bar'), new Foo(3)];

console.log(get(Foo, foos, 1));
console.log(get(Foo, foos, 2));
console.log(get(Bar, foos, 3));

Playground Link

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...