如何对打字稿中的方法重载实施严格检查?

问题描述

我想对类似以下类的重载方法进行严格检查:

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;

解决问题。