首页 > 解决方案 > 让在 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.

标签: typescripttypescript-typings

解决方案


有几件事需要改变。

  • 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;
    };
}

(重命名接口以不与fetchAPI冲突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


推荐阅读