继承 T 的打字稿泛型函数
typescript Generic Function that inherit T
我要尝试向 Function
添加一个方法。
问题是 return 值不会自动继承 T。
interface Function {
Promise <T> (...args: any[]): Promise<T> ;
}
Function.prototype.Promise = async function <T> (this: Function , ...args: any[]): Promise <T> {
return new Promise <T> ((resolve, reject) => {
this(args).then((x: T) => resolve(x)).catch((e: any) => reject(e));
});
}
var test =(async()=> {
return "";
});
// this return Promise<unknown> it should return Promise<string>
test.Promise()
// this should work, but I want the above to work instead
// it should inherit the type automaticly
test.Promise<string>()
您可以捕获使用 this
参数调用的函数的类型。您还可以捕获参数的类型和 return 类型以更好地输入结果函数。
interface Function {
Promise<TReturn, TArgs extends any[]>(this: (...a: TArgs) => Promise<TReturn>, ...a: TArgs): Promise<TReturn>;
}
Function.prototype.Promise = async function <TReturn, TArgs extends any[]>(this: (...a: TArgs) => Promise<TReturn>, ...args: TArgs): Promise<TReturn> {
return new Promise<TReturn>((resolve, reject) => {
this(...args).then((x: TReturn) => resolve(x)).catch((e: any) => reject(e));
});
}
var test = (async () => {
return "";
});
// this return Promise<unknown> it should return Promise<string>
test.Promise()
我要尝试向 Function
添加一个方法。
问题是 return 值不会自动继承 T。
interface Function {
Promise <T> (...args: any[]): Promise<T> ;
}
Function.prototype.Promise = async function <T> (this: Function , ...args: any[]): Promise <T> {
return new Promise <T> ((resolve, reject) => {
this(args).then((x: T) => resolve(x)).catch((e: any) => reject(e));
});
}
var test =(async()=> {
return "";
});
// this return Promise<unknown> it should return Promise<string>
test.Promise()
// this should work, but I want the above to work instead
// it should inherit the type automaticly
test.Promise<string>()
您可以捕获使用 this
参数调用的函数的类型。您还可以捕获参数的类型和 return 类型以更好地输入结果函数。
interface Function {
Promise<TReturn, TArgs extends any[]>(this: (...a: TArgs) => Promise<TReturn>, ...a: TArgs): Promise<TReturn>;
}
Function.prototype.Promise = async function <TReturn, TArgs extends any[]>(this: (...a: TArgs) => Promise<TReturn>, ...args: TArgs): Promise<TReturn> {
return new Promise<TReturn>((resolve, reject) => {
this(...args).then((x: TReturn) => resolve(x)).catch((e: any) => reject(e));
});
}
var test = (async () => {
return "";
});
// this return Promise<unknown> it should return Promise<string>
test.Promise()