我写了这个函数,但它抛出一个错误,我不明白为什么......
const createObject = async (): Promise<MyType> => {
await Promise.resolve();
return {
async foo() {
await this.bar();
// do something else
},
async bar() {
await Promise.resolve();
// do something here
}
};
};
interface MyType {
foo: () => Promise<void>;
bar: () => Promise<void>;
}
Run Code Online (Sandbox Code Playgroud)
为什么第 5 行的函数调用this.bar()显示错误?它告诉我它this是类型MyType或PromiseLike<MyType>. 第二种可能的类型是问题,但我不知道在哪种情况下这可能是PromiseLike?难道不能假设如果调用该函数,则它始终是“已加载”吗object?
解决这个问题最优雅的方法是什么?目前我正在这样做(这绝对是丑陋的,并且作为代码的读者无法理解):
await (await this).bar();
Run Code Online (Sandbox Code Playgroud)
我还发现设置函数的返回类型createObjectfromPromise<MyType>可以Promise<any>解决问题,但这不是很准确。
由于createObject是一个返回 的异步函数Promise<MyType>,因此其中的 return 语句可以返回Promise<MyType>或MyType。两者都有效。因此,当你直接返回一个对象字面量时,打字稿会有点违反直觉地推断出该对象的类型是Promise<MyType> | MyType,并相应地键入this。
如果对象文字直接在返回中,则无法更改此设置。您可以做的是使用中间变量。该变量的类型将独立,然后根据返回类型进行检查:
const createObject = async (): Promise<MyType> => {
await Promise.resolve();
let result: MyType = {
async foo() {
await this.bar();
// do something else
},
async bar() {
await Promise.resolve();
// do something here
}
};
return result;
};
interface MyType {
foo: () => Promise<void>;
bar: () => Promise<void>;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2191 次 |
| 最近记录: |