【问题标题】:Typescript: No error for overloaded methods with different return types打字稿:具有不同返回类型的重载方法没有错误
【发布时间】:2018-11-01 05:16:37
【问题描述】:

希望该标题足以解释我正在尝试处理的情况!最近,我试图为一个方法创建一个接口,该接口可以接受或者一个回调参数或返回一个promise。这是为了处理不将基于 Promise 的模式引入仅使用回调的代码库的遗留部分。

这是我定义的接口和该接口的实现的示例:

interface ITest {
    get(callback: () => void): void;

    get(): Promise<void>;
}


class Test implements ITest {
    public get(callback?: () => void): Promise<void> {
        if (typeof callback === 'function') {
            callback();
            return;
        }
        return Promise.resolve();
    }
}

这似乎可行,但是,有一种情况没有处理:

const t = new Test();
// Good
t.get(() => console.log('callback'));
// Good
t.get().then(() => console.log('then'));
// Bad - Exception
t.get(() => console.log('callback')).then(() => console.log('then'));

我希望在最后一个示例中,Typescript 会抱怨没有用于接受回调并返回承诺的函数的签名。但是,如果我在下面进行了调整,TypeScript 确实会抱怨:

const t: ITest = new Test();

通过该更改,最后一个示例确实触发了 TSC 错误。我明白为什么会这样,因为我明确表示t 正在实现ITest。但是,我可以看到这是我很容易忘记做的事情。

所以,问题是:有没有更好的方法来完成我希望做的事情?

编辑:很快就得到了答案,标记如下!如果您对使用该答案的“已编译”类的外观感兴趣:

var Test = /** @class */ (function () {
    function Test() {
    }
    Test.prototype.get = function (callback) {
        if (typeof callback === 'function') {
            callback();
            return;
        }
        return Promise.resolve();
    };
    return Test;
}());

最后,我根本不知道 Typescript 会允许并删除该方法的那些附加声明。我可以看到需要在我的代码中添加一些额外的 cmets 来向不熟悉的人解释 - 就像我刚才一样 - 为什么需要这些额外的声明。

【问题讨论】:

    标签: typescript typescript-types


    【解决方案1】:

    您需要明确指定两个重载才能获得所需的错误类型。问题是,虽然类中的get 方法在检查使用类中函数的签名时确实实现了接口中的方法(它满足它的约束)。您可以显式指定这两个重载,并且实现签名(当前存在的那个)将保持对外部隐藏。

    interface ITest {
        get(callback: () => void): void;
    
        get(): Promise<void>;
    }
    
    
    class Test implements ITest {
    
        public get(callback: () => void): void;
        public get(): Promise<void>;
        public get(callback?: () => void): Promise<void> {
            if (typeof callback === 'function') {
                callback();
                return;
            }
            return Promise.resolve();
        }
    }
    
    const t = new Test();
    // Good
    t.get(() => console.log('callback'));
    // Good
    t.get().then(() => console.log('then'));
    // Compile time error
    t.get(() => console.log('callback')).then(() => console.log('then'));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-26
      • 2014-01-09
      • 1970-01-01
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多