Типы (и параметры типов) стираются во время компиляции, поэтому вы не можете сказать 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