有兩個類:
class STRING_TYPE {
name():string{
return "one";
}
}
class NUMBER_TYPE {
name():number{
return 1;
}
}
我想寫一個通用函式:
- 創建給定類的物件
- 呼叫 name() 方法,并回傳其值;在javascript中,代碼如下:
function foo(classType) {
const obj = new classType();
return obj.name();
}
如何在打字稿中寫它?
// it doesn't work.
function foo<T>(typ: T): ReturnType<T.name>{
const obj = new T();
return obj.name();
}
uj5u.com熱心網友回復:
您需要為classType引數設定約束:
class STRING_TYPE {
value(): string {
return "one";
}
}
class NUMBER_TYPE {
name(): number {
return 1;
}
}
type AnyClass<Return> = new (...args: any[]) => Return
const foo = <Klass extends AnyClass<{ name: () => number }>>(classType: Klass) =>
new classType().name();
const result = foo(NUMBER_TYPE)
操場
foo需要一個帶name方法的類建構式。TS 能夠推斷回傳型別。
更新
class STRING_TYPE {
name(): string {
return "one";
}
}
class NUMBER_TYPE {
name(): number {
return 1;
}
}
type AnyClass<R> = new (...args: any[]) => R
const foo = <
Return extends { name: () => any },
Klass extends AnyClass<Return>,
>(classType: Klass): ReturnType<InstanceType<Klass>['name']> =>
new classType().name()
foo(NUMBER_TYPE) // number
foo(STRING_TYPE) // string
uj5u.com熱心網友回復:
你可以這樣做:
class STRING_TYPE {
value(): string {
return 'one';
}
}
class NUMBER_TYPE {
name(): number {
return 1;
}
}
function foo(classType: typeof STRING_TYPE): string; // ReturnType<STRING_TYPE['value']>
function foo(classType: typeof NUMBER_TYPE): number; // ReturnType<NUMBER_TYPE['name']>
function foo(classType: typeof STRING_TYPE | typeof NUMBER_TYPE) {
const obj = new classType();
return obj instanceof STRING_TYPE ? obj.value() : obj.name();
}
const bar = foo(STRING_TYPE);
const baz = foo(NUMBER_TYPE);
console.log(bar, baz);
操場
假設你在這里提問時打錯了字,并且你的兩個類都有一個name方法,你可以這樣做:
class STRING_TYPE {
name(): string {
return 'one';
}
}
class NUMBER_TYPE {
name(): number {
return 1;
}
}
type ClassType =
| typeof STRING_TYPE
| typeof NUMBER_TYPE;
function foo<T extends ClassType>(classType: T) {
const obj = new classType();
return obj.name() as ReturnType<InstanceType<T>['name']>;
}
const bar = foo(STRING_TYPE);
const baz = foo(NUMBER_TYPE);
console.log(bar, baz);
操場
參考:
- https://stackoverflow.com/q/12802317#comment31618674_12871488
- https://stackoverflow.com/a/48808100
- https://stackoverflow.com/a/53289298
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/317144.html
