我想T在 Typescript 的泛型類中創建一個實體。下面的代碼是我認為可以作業的,但不幸的是它沒有。
type Constructor<T> = { new(...args: any[]): T };
class Bar { }
class Foo<T extends Constructor<T>> {
constructor( /* some parameters here, but NOT a type creator! */ ) {}
create(): T {
return new T();
}
}
const bar: Bar = new Foo<Bar>().create();
那么這里還有一些其他的問題/答案,但都使用某種需要傳遞給通用類/函式的型別創建器,如下所示:
function create<T>(creator: new() => T): T {
return new creator();
}
const bar: Bar = create<Bar>(Bar);
但我的 ctor 不需要有這樣的東西。該create函式應始終保持無引數。有沒有辦法使這項作業?
uj5u.com熱心網友回復:
簡而言之:不,沒有對可構造運行時值的參考是不可能的。
原因是 TypeScript 型別只存在于編譯時(而不是運行時),不能用作值。在您的示例中,T只是一種型別(不是運行時值)。這是您的 TypeScript 程式編譯將生成的 JavaScript:
class Bar {}
class Foo {
constructor() { }
create() {
return new T();
}
}
const bar = new Foo().create();
// ^^^^^^^^
// Exception is thrown: ReferenceError: T is not defined
您可以看到這T是對不存在的運行時值的參考,因此在呼叫該方法ReferenceError時會引發例外。create
相反,您可以接受可構造物件(及其引數)并回傳構造實體:
TS游樂場
type Constructible<
Params extends readonly any[] = any[],
T = any,
> = new (...params: Params) => T;
class Foo {
static create <T extends Constructible>(
constructible: T,
...params: ConstructorParameters<T>
): InstanceType<T> {
return new constructible(...params);
}
}
class Bar {}
class Baz {
constructor (readonly param1: string, readonly param2: number) {}
}
const bar = Foo.create(Bar);
const baz = Foo.create(Baz, '2', 2);
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/430695.html
