【问题标题】:Typescript interfaces and promise return an object/constructor?打字稿接口和承诺返回一个对象/构造函数?
【发布时间】:2022-01-14 07:10:09
【问题描述】:

我有一个返回类型的 Promise

person.ts

const personFactory: PersonFactory = (name, lastName) => ({ speak: () => console.log(`${name}:${lastName}`); });
const personPromise: Promise<PersonFactory | null> = Promise.resolve().then(function handler() { return personFactory });

export const loadPerson = (): Promise<PersonFactory | null> => {
  return personPromise;
};

index.ts

declare global {
  interface Metaverse {
    Person?: PersonFactory;
  }
}

export interface PersonClient {
    speak: (args: string) => void;
}

export type PersonFactory = (firstName: string, lastName: string) => PersonClient;

person.ts 和 index.ts 打包后放入 npm 包中。

测试 ts 项目 - index.ts

import { loadPerson } from '@person/library';

const load = async () => {
  const person = await loadPerson();

  if (person) {
    person('drag13', 'developer').speak('something');
  }
}

load()

// 或

(async function() {
 let person = await loadPerson();
 person("drag13", "developer").speak("this===is===a===message")
})()

-- 更新

我使用了 Drag13 的示例并将其打包成一个 npm。当我调用 loadPerson 时,控制台会打印出说话的字符串。

但是有一个打字稿错误提示

TS2349: This expression is not callable. Type 'PersonFactory' has no call signatures.

【问题讨论】:

  • Promise.resolve().then(() =&gt; { console.log("Hello World") }); 不会产生PersonFactory
  • 请把光标放到loadPerson 并按F12。我对类型很好奇,或者提供图书馆的链接
  • 现在好像没问题,也许我缓存了一些东西。

标签: typescript promise


【解决方案1】:

您定义了您的承诺应该return factory 或 null。但是在您的代码中,您没有返回任何内容。

正确的版本如下所示:

const personPromise: Promise<PersonFactory | null> = Promise.resolve().then(() => () => ({ speak: () => null }));

现在你可以这样使用:

(async function () {

    interface PersonClient {
        speak: (args: string) => void;
    }

    type PersonFactory = (firstName: string, lastName: string) => PersonClient;
    const personFactory: PersonFactory = (name, lastName) => ({ speak: () => `${name}:${lastName}` });
    const personPromise: Promise<PersonFactory | null> = Promise.resolve().then(function handler() { return personFactory });

    const person = await personPromise;

    if (person) {
        person('drag13', 'developer').speak('something');
    }

})()

为了让它发挥作用,我们:

  • 定义函数personFactory
  • then返回personFactory

现在可以使用了 - Playground

【讨论】:

  • 我不太确定“then(() => () => ({ speak: () => null }))” 的作用。这可以简化吗?
  • 让我们明确@fes - 查看更新
  • 我确实说过:() => console.log(${name}:{lastName});它在控制台中打印出来,但我收到了这个 TS 警告。 “此表达式不可调用。类型 'PersonFactory' 没有调用签名。”
  • @fes 请使用相关代码更新问题。我已经把链接放到了操场上——现在没有错误
  • 我更新了原帖。即使调用了 speak 方法,我也不知道为什么会出现 Typescript 问题。
猜你喜欢
  • 2021-08-15
  • 2021-06-17
  • 2017-11-25
  • 2018-06-26
  • 2018-07-15
  • 2016-09-14
  • 1970-01-01
  • 2019-04-25
  • 2017-10-21
相关资源
最近更新 更多