【问题标题】:How to define a Typescript type using generics如何使用泛型定义 Typescript 类型
【发布时间】:2021-01-30 03:54:00
【问题描述】:

假设我有以下定义对象的接口:

interface ExampleInterface {
    a: string:
    b: number;
    c: AsyncFunction<boolean>
}

其中 AsyncFunction 定义为:

type AsyncFunction<T> = () => Promise<T>;

如果提供给 c: 的函数没有参数,这目前运行良好,但如果函数有任何参数,则会导致 TS2322 编译错误。

这个想法是 &lt;T&gt; 用于在函数的 Promise 中定义返回类型。该函数可能需要也可能不需要自己的参数,但它必须在 Promise 中提供指定的 T 返回类型。

我的问题是,有没有办法修改类型定义,以便在 c: 中使用具有零个或任意数量参数的任何函数?

我试图理解 infer,但我所有使用它的尝试(它可能不是我想要的)都以 c 结束:有(任何)回报类型不是我想要的。我也尝试过使用以下方法,但没有成功。

type AsyncFunction<T> = (...args: any[]) => Promise<T>;

提前致谢。

【问题讨论】:

  • 您需要reproducible example 这个问题,我们才能为您提供帮助。如果可能,请尝试在 playground 中复制它。如果问题没有出现在 Playground 中,请给出最低限度以使用 tsc/vscode 重现它。

标签: typescript typescript-generics


【解决方案1】:

您的示例“尝试了以下没有成功的完美工作”:

Playground

【讨论】:

  • 也许我正经历着这样的一天。在 TS 操场上,你是对的,它正在工作。我正在使用 Visual Studio。传递不带参数的函数时,我可以将 c 设置为 c: foo,但如果 foo 有参数,我必须使用 c: () =&gt; foo(1, "x")。我从来没有遇到过这种情况,老实说,我不确定为什么会这样。
  • 其实更进一步,如果我设置为c: () =&gt; foo(1, "x"),我什至不需要类型定义中的...args: any[]
  • @JonBellamy foo 的类型是什么?
  • 这是一个函数。 async function foo(a: number, ...): Promise&lt;boolean&gt;{}
  • 我刚刚意识到为什么它不起作用,我完全是个白痴——也许我应该休息一下。现在问题来了,我会为遇到它的其他人提供答案。很抱歉浪费你的时间,我已经给你投票了,如果我可以删除这个问题,理由是“OP很愚蠢”,我会的!谢谢你帮助我清醒过来!
【解决方案2】:

感谢@Rubydesic 让我浏览所有内容以提供更多详细信息,我意识到自己是个白痴。

它无法编译的原因与类型定义无关 - 实际上不需要更改。

问题是没有参数,我只是将方法名称传递给 c:

async function foo(): Promise<boolean> {
// Body omitted
}

const x: ExampleInterface = {
a: 'a',
b: 0,
c: foo
}

当然,这行得通,但是当该方法有参数时,我将这些参数传入(因为需要括号,所以会尝试执行它,而不是传入它 - 这部分我在很长一段时间后未能意识到天 - 谈论错过明显的)。我在做:

async function bar(a: number): Promise<boolean> {
// Body omitted
}

const x: ExampleInterface = {
a: 'a',
b: 0,
c: bar(0)
}

我应该做的时候

async function bar(a: number): Promise<boolean> {
// Body omitted
}

const x: ExampleInterface = {
a: 'a',
b: 0,
c: () => bar(0)
}

作为一个痛苦的提醒,每隔一段时间就休息一下。 10 年来,我认为我从未对这个问题如此盲目!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-26
    • 2020-07-31
    • 2021-06-03
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    • 2019-07-23
    相关资源
    最近更新 更多