打字稿接口和承诺返回一个对象/构造函数?
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(() => 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');
)()
为了让它发挥作用,我们:
定义函数personFactory
从then
返回personFactory
现在可以使用了 - Playground
【讨论】:
我不太确定“then(() => () => ( speak: () => null ))” 的作用。这可以简化吗? 让我们明确@fes - 查看更新 我确实说过:() => console.log($name:lastName
);它在控制台中打印出来,但我收到了这个 TS 警告。 “此表达式不可调用。类型 'PersonFactory' 没有调用签名。”
@fes 请使用相关代码更新问题。我已经把链接放到了操场上——现在没有错误
我更新了原帖。即使调用了 speak 方法,我也不知道为什么会出现 Typescript 问题。以上是关于打字稿接口和承诺返回一个对象/构造函数?的主要内容,如果未能解决你的问题,请参考以下文章