如何使用泛型定义Typescript类型

如何使用泛型定义Typescript类型,typescript,typescript-generics,Typescript,Typescript Generics,假设我有以下定义对象的接口: interface ExampleInterface { a: string: b: number; c: AsyncFunction<boolean> } 接口示例接口{ a:字符串: b:数字; c:异步函数 } 其中,AsyncFunction由以下内容定义: type AsyncFunction<T> = () => Promise<T>; 类型AsyncFunction=()=>承诺;

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

interface ExampleInterface {
    a: string:
    b: number;
    c: AsyncFunction<boolean>
}
接口示例接口{
a:字符串:
b:数字;
c:异步函数
}
其中,AsyncFunction由以下内容定义:

type AsyncFunction<T> = () => Promise<T>;
类型AsyncFunction=()=>承诺;
如果提供给c:的函数没有参数,则该方法目前运行良好,但如果该函数有任何参数,则会导致TS2322编译错误

其思想是使用
在函数的承诺范围内定义返回类型。函数可能需要也可能不需要自己的参数,但它必须在承诺中提供指定的T返回类型

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

我试图理解推断,但我所有尝试使用它(可能不是我想要的)的结果都是c:有一个(任意)返回类型,这不是我想要的。我也尝试过使用下面的方法,但没有成功

type AsyncFunction<T> = (...args: any[]) => Promise<T>;
type AsyncFunction=(…args:any[])=>Promise;
提前感谢。

您的示例“尝试了以下方法,但没有成功,效果很好”:


多亏@Rubydesic让我仔细检查了所有的细节,我才意识到自己是个白痴

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

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

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

const x: ExampleInterface = {
a: 'a',
b: 0,
c: foo
}
异步函数foo():Promise{ //省略正文 } 常数x:ExampleInterface={ a:‘a’, b:0, c:福 } 当然,这是可行的,但是当这个方法有参数时,我就传入了这些参数(因为需要括号,所以会尝试执行它,而不是传入-我在漫长的一天之后没有意识到的部分-谈论忽略显而易见的部分)。我在做:

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

const x: ExampleInterface = {
a: 'a',
b: 0,
c: bar(0)
}
异步功能条(a:number):承诺{ //省略正文 } 常数x:ExampleInterface={ a:‘a’, b:0, c:巴(0) } 当我应该做的时候

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

const x: ExampleInterface = {
a: 'a',
b: 0,
c: () => bar(0)
}
异步功能条(a:number):承诺{ //省略正文 } 常数x:ExampleInterface={ a:‘a’, b:0, c:()=>巴(0) }
这个答案是一个痛苦的提醒,提醒你要经常休息一下。十年来,我从未对这个问题如此视而不见

也许我正在经历这样的一天。在TS操场,你是对的,它正在工作。我正在使用VisualStudio。当传递一个没有参数的函数时,我可以将c设置为
c:foo
,但是如果foo有参数,我必须使用
c:()=>foo(1,x”)
。我从来没有遇到过这种情况,老实说,我不知道为什么会是这样。实际上更进一步,如果我将它设置为
c:()=>foo(1,“x”)
,我甚至不需要类型定义中的
…args:any[]
。@JonBellamy
foo
的类型是什么?它是一个函数<代码>异步函数foo(a:number,…):承诺{}我刚刚意识到为什么它不工作,我是个十足的白痴——也许我应该休息一下。现在问题就在这里,我将为任何遇到它的人提供答案。很抱歉浪费了你的时间,我已经给了你投票权,如果我能以“OP愚蠢”的理由删除这个问题,我会的!谢谢你帮助我恢复理智!你需要解决这个问题,我们才能帮助你。如果可能的话,试着在计算机中复制它。如果问题没有在操场上表现出来,请给出用tsc/vscode重现该问题的最小值。