如何对TypeScript中的类使用函数重载?

如何对TypeScript中的类使用函数重载?,typescript,Typescript,给定以下类型脚本代码 class NumberChecker { } class StringChecker { } class Component {} class ComponentChecker { } class Grid { } class GridChecker { } function check(element: number): NumberChecker; function check(element: string): StringChecker; function ch

给定以下类型脚本代码

class NumberChecker { }
class StringChecker { }
class Component {}
class ComponentChecker { }
class Grid { }
class GridChecker { }

function check(element: number): NumberChecker;
function check(element: string): StringChecker;
function check(element: Grid): GridChecker;
function check(element: Component): ComponentChecker {
    if (typeof element === 'number') {
        return new NumberChecker();
    }
    if (typeof element === 'string') {
        return new StringChecker();
    }
    if (element instanceof Component) {
        return new ComponentChecker();
    }
    if (element instanceof Grid) {
        return new GridChecker();
    }
}

const a = check(2); // a is NumberChecker
const b = check('sdf'); // b is StringChecker
const c = check(new Component()); // c is GridChecker
const d = check(new Grid()); // d is GridChecker
为什么
c
d
都是
GridChecker
?我希望
c
成为
ComponentChecker


实际实施的签名需要涵盖所有选项,在您的情况下,签名应该是:

function check(element: number): NumberChecker;
function check(element: string): StringChecker;
function check(element: Grid): GridChecker;
function check(element: Component): ComponentChecker;
function check(element: number | string | Grid | Component) {
    // ...
}
然后选择以下类型:

const c = check(new Component());
ComponentChecker


但是,同样,只有在不同的类没有相同的结构时才可以使用。

您应该使用不同的定义重试。那些
组件
网格
当前是兼容的。只是尝试将不同的属性添加到这两个类中,得到了编译错误“重载签名与函数实现不兼容”。我不知道如何解决。但这是一个好问题。每个
检查器
类将有不同的方法。如果我尝试添加它们,我会得到更多的编译错误。我认为返回类型不必彼此兼容。