我有一个Contract类,它保存函数的合约:
type MethodType = (...args: any) => any;
class Contract<T extends MethodType> {
}
我想有一个类似的班为班。我的尝试实现它:
class ContractForClass<T extends Record<string, any>> {
methods!: Record<string, Contract<MethodType>;
forMethod(methodName: string): Contract<MethodType> {
return this.methods[methodName]
}
setContractForMethod(method: string, contract: Contract<MethodType>) {
this.methods[method] = contract
}
}
我的问题是方法合同的类型信息丢失了。在下面的例子中,检索到的合同没有它们的原始类型:
const classContract = new ContractForClass<HttpClient<number>>();
classContract.setContractForMethod("get", new Contract<HttpClient<number>["get"]>)
classContract.setContractForMethod("post", new Contract<HttpClient<number>["post"]>)
const getcontract = classContract.forMethod("get")//want Contract<(url: string) => number >
const postContract = classContract.forMethod("post")//want Contract<(url:string, payload: number) => void>
Playground链接
1条答案
按热度按时间2izufjch1#
关键是对函数使用Map类型和泛型类型。
还有一个问题,允许设定合同的其他方法比预期的,但这是一个问题的问题。
Playground链接