typescript - 打字稿:为什么 PromiseLike 在异步函数的对象中可能是 this 的类型?
问题描述
我写了这个函数,但它抛出一个错误,我不明白为什么......
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>;
}
为什么第 5 行的函数调用this.bar()
显示错误?它告诉我它this
是 typeMyType
还是 a PromiseLike<MyType>
。第二种可能的类型是问题,但我看不出在哪种情况下这可能是PromiseLike
?难道它不能假设如果调用该函数,这总是一个“加载”object
吗?
最优雅的方法是什么?目前我正在这样做(这绝对是丑陋的,作为代码的读者无法理解):
await (await this).bar();
我还发现设置函数的返回类型createObject
fromPromise<MyType>
可以Promise<any>
解决问题,但这不是很准确。
解决方案
由于createObject
是一个返回的异步函数Promise<MyType>
,因此其中的 return 语句可以是 returnPromise<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>;
}
推荐阅读
- xslt - 使用 xslt 在同一 xpath 中将段添加到 xml
- amazon-web-services - Docker 编写 AWS
- vb.net - VB.NET ComboBox 无法识别文本更改
- python - 打印使用 lxml 抓取和解析的表数据
- c# - 删除实体框架上下文中的所有记录并重新创建它的正确方法是什么?
- javascript - getRangeAt(0) 返回带有 parentNode 文档片段的 #text 节点
- javascript - 如何在不知道其类或 ID 的情况下定位特定元素,但确实拥有该元素的所有 DOM 详细信息
- vue.js - 对于 Vuex Store 中的每个项目,分配一个分数(基于计算),然后按分数排序
- php - 为事件日历插件添加新事件时预填充 post_title 和 post_content
- mongoose - Mongoose:填充嵌套的 id 数组