【发布时间】: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