问题描述
我想对类似以下类的重载方法进行严格检查:
type NO_ParaM = 'noparam' | 'nop';
type ONE_ParaM = 'oneParam' | 'getone';
type ONE_ParaM_PLUS = 'oneAndMoreParam';
class Caller {
get(type: NO_ParaM): Promise<string>;
get(type: ONE_ParaM,arg: string): Promise<string>;
get(type: ONE_ParaM_PLUS,arg0: string,...args: string[]): Promise<string>;
async get(type: NO_ParaM | ONE_ParaM | ONE_ParaM_PLUS,...args: string[]): Promise<string> {
// async get(type: string,...args: string[]): Promise<string> { // Alternative
// implementation;
return `${type} called`;
}
}
const obj = new Caller();
obj.get('noparam') // ok
obj.get('oneParam','foo') // ok
obj.get('oneAndMoreParam','foo','bar') // ok
obj.get('noparam','bar') // should not pass typescript checking
obj.get('oneAndMoreParam') // should not pass typescript checking
有什么想法吗?
封闭的stackoverflow问题是:TypeScript function overloading
谢谢。
解决方法
向哈桑·纳克维致敬,我发现了问题:
要匹配我的原始代码,我应该将第3行更改为:
const p1 = ['noParam','nop'] as const;
const p2 = ['oneParam','getOne'];
const p3 = ['oneAndMoreParam'];
type NO_PARAM = typeof p1[number];
type ONE_PARAM = typeof p2[number];
type ONE_PARAM_PLUS = typeof p3[number];
就我而言,我忘记添加2个缺少的常量。
const p1 = ['noParam','getOne'] as const;
const p3 = ['oneAndMoreParam'] as const;
解决问题。