我正在寻找一种方法来获取传递给构造函数的函数参数的类型信息。
export class Test<T> {
constructor(
test: ((... params : any[]) => T) | (( ... params : any[] ) => Promise<T>
) {
// Convert function or promise to promise
this.test = this.test = (...params: any[]) => Promise.resolve(test(...params))
}
// How I store the promisify'd function/promise
private test : (...params) => Promise<T>
// I want to see typing information on the parameters for this method
public async execute(...params: any[]) : Promise<any> {
try {
return await this.test(...params)
} catch (error) {
return error
}
}
传递函数或承诺时,我将其存储为承诺。目前输入的信息丢失了。
在execute方法中,我希望能够看到要传入的参数的输入信息;它们应该匹配原始功能的参数。
例如;
let test = new Test( (a: number, b: string) : string => `${a}${b}`)
let output : string = test.execute(1, 'b') // should compile
let output : number = test.execute(1, 'b') // should not compile
let output : string = test.execute('b', 1) // should not compile, and this is the one I'm looking for.
有什么想法吗?我想知道我是否可以巧妙地使用keyof
。
答案 0 :(得分:1)
无法在运行时获取参数类型,类型信息在编译期间全部被删除。但是,您可以向构造函数添加一个额外的参数,并将其作为布尔文字类型输入,这样如果函数返回一个promise,则第二个参数必须为true,如果它返回一个值,则第二个参数必须为false:
export class Test<T> {
constructor(test: ((... params : any[]) => T), isPromise: false)
constructor(test: ( ... params : any[] ) => Promise<T>, isPromise: true)
constructor(
test: ((... params : any[]) => T) | (( ... params : any[] ) => Promise<T>),
isPromise: boolean
) {
// Convert function or promise to promise
if(!isPromise) {
this.test = (...params: any[]) => Promise.resolve(test(...params))
} else {
this.test = test;
}
}
// How I store the promisify'd function/promise
private test : (...params: any[]) => Promise<T>
}
let test = new Test<string>((a: number, b: string) : string => `${a}${b}`, false) //ok
let test2 = new Test<string>( (a: number, b: string) : string => `${a}${b}`, true) // compiler error
let test3 = new Test<string>( (a: number, b: string) => Promise.resolve(`${a}${b}`), true) //ok
let test4 = new Test<string>( (a: number, b: string) => Promise.resolve(`${a}${b}`), false) // compiler error
答案 1 :(得分:1)
可变参数is proposed的输入,但仍在讨论中。