如何使用泛型定义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[]
。@JonBellamyfoo
的类型是什么?它是一个函数<代码>异步函数foo(a:number,…):承诺{}我刚刚意识到为什么它不工作,我是个十足的白痴——也许我应该休息一下。现在问题就在这里,我将为任何遇到它的人提供答案。很抱歉浪费了你的时间,我已经给了你投票权,如果我能以“OP愚蠢”的理由删除这个问题,我会的!谢谢你帮助我恢复理智!你需要解决这个问题,我们才能帮助你。如果可能的话,试着在计算机中复制它。如果问题没有在操场上表现出来,请给出用tsc/vscode重现该问题的最小值。