【发布时间】:2020-07-31 13:44:17
【问题描述】:
在为选项对象创建接口时,我试图允许用户指定具有显式返回类型和通用参数类型的函数。如果您事先没有为函数定义类型,这是可能的,但我不知道如何为您已经定义的函数类型执行此操作。
例如,这很好用:
interface Options {
// Other options...
converterFunction: <T>(rawData: T) => [];
}
但这似乎是一种合理的语法,但事实并非如此。
type ConverterFunction<T> = (rawData: T) => [];
interface Options {
// Other options...
converterFunction: <T>ConverterFunction<T>; // TypeScript is unhappy
}
使接口通用并不能解决我的问题,我想使用我的预定义类型而不是随意重新定义它们。
【问题讨论】:
-
ConverterFunction<T>类型不是泛型函数,所以在定义Options时不能使用。您可能需要generic values 之类的东西以编程方式将引用特定函数的泛型类型转换为引用泛型函数的特定类型。但是该语言现在不支持该功能。据我所知,您必须重新定义您的类型。 -
谢谢,@jcalz。所以澄清一下,如果一个泛型函数被命名,它就不再是泛型的了?
-
不完全是。
type Foo = <T>(x: T)=>T是泛型函数的非泛型类型别名,而type Bar<T> = (x: T)=>T是非泛型函数的泛型类型别名。您可以同时拥有:type Baz<T> = <U>(x: T, y: U) => [T, U]。问题是 TS 中有两种不同类型的泛型,它们根据泛型参数的范围和指定它的人而有所不同。通用函数在调用签名上有一个参数,调用者指定它。泛型类型别名/接口/类在定义中有参数,后面引用时会指定。 -
谢谢!我切换到另一个帐户,所以我认为我还没有能力因为声誉而投票,但这是非常有帮助的澄清!
标签: typescript generics types interface