打字稿接口和承诺返回一个对象/构造函数?

Posted

技术标签:

【中文标题】打字稿接口和承诺返回一个对象/构造函数?【英文标题】: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。我对类型很好奇,或者提供图书馆的链接 现在好像没问题,也许我缓存了一些东西。 【参考方案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');
    

)()

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

定义函数personFactorythen返回personFactory

现在可以使用了 - Playground

【讨论】:

我不太确定“then(() => () => ( speak: () => null ))” 的作用。这可以简化吗? 让我们明确@fes - 查看更新 我确实说过:() => console.log($name:lastName);它在控制台中打印出来,但我收到了这个 TS 警告。 “此表达式不可调用。类型 'PersonFactory' 没有调用签名。” @fes 请使用相关代码更新问题。我已经把链接放到了操场上——现在没有错误 我更新了原帖。即使调用了 speak 方法,我也不知道为什么会出现 Typescript 问题。

以上是关于打字稿接口和承诺返回一个对象/构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

从类创建派生类型,但省略构造函数(打字稿)

开玩笑的打字稿 - 模拟日期构造函数

打字稿 - 在函数返回之前等待承诺解决

如何监视调用另一个返回承诺的服务的服务函数 - 打字稿

打字稿通用承诺返回类型

使用打字稿在构造函数中动态设置类属性