typescript - 让在 Promise 构造函数中分配的变量被 Typescript 标记为未定义
问题描述
我正在定义一个let
名为的变量resolver
,然后我想在 Promise 构造函数中分配它。
interface Request {
ids: string[];
resolver: () => void;
promise: Promise<unknown>
}
class Foo {
public requests: Request[] = [];
public createPromise = (ids: string[]) => {
let resolver;
const promise = new Promise((r) => { resolver = r; });
this.requests.push({ ids, resolver, promise });
return promise;
};
}
resolver
但是当我尝试将对象推送到请求列表时,我收到以下 TypeScript 错误:
Type 'undefined' is not assignable to type '() => void'.ts(2322)
resolver
我在 promise 构造函数中分配的变量被标记为undefined
.
解决方案
有几件事需要改变。
resolver
应该给局部变量一个与请求接口匹配的显式类型。- 您需要断言 (
!
) 将分配变量。分配发生在回调函数中,TS 无法知道何时调用此函数。不同的类可能会在构造函数中采用类似的回调,而不是立即调用它。 - 请求接口中的函数应该接受与承诺匹配类型的值参数。如果您不需要解析值,则可以
Promise<void>
改用。
interface IRequest {
ids: string[];
resolver: (value: unknown) => void;
promise: Promise<unknown>
}
class Foo {
public requests: IRequest[] = [];
public createPromise = (ids: string[]) => {
let resolver!: (value: unknown) => void;
const promise = new Promise((r) => { resolver = r; });
this.requests.push({ ids, resolver, promise });
return promise;
};
}
(重命名接口以不与fetch
API冲突Request
。)
分配问题的示例:
class FakePromise {
constructor(executor) {
// *crickets*
}
}
let resolver1;
new Promise(r => resolver1 = r);
console.log(resolver1); // function () ...
let resolver2;
new FakePromise(r => resolver2 = r);
console.log(resolver2); // undefined
推荐阅读
- typescript - 根据承诺的结果在量角器中创建动态它
- ios - async function run() { ^^^^^^^^ SyntaxError: Unexpected token function
- sql-server - 为什么在 SQL Server 中违反 PRIMARY KEY 约束返回错误代码 2627 而不是 2601?
- django - Django:如何让 setUpTestData 为所有测试运行一次?
- angular - 如何更改 *ngFor 中的单个 mouseover 和 mouseout 事件?
- powershell - 如何使用 PowerShell 将字符替换为 $_
- javascript - 揭示模块模式结合 ES6 模块
- java - 来自外键列的 JDBC getString()
- python - 如何将大型数据集从 csv 读取到数据框中?
- sql-server - 根据 SSMS 中的时间戳检索前一行