【发布时间】:2022-12-01 02:25:41
【问题描述】:
我创建了一个带有返回参数的泛型函数类型,它完全依赖于输入参数类型,并且泛型参数有一个 extends 子句。这是一个虚拟版本:
type Foo = {}
type MyFunc <T extends Foo> = (a: T, b: T) => T[];
const bar: MyFunc<number> = (a: number, b: number) => [a,b];
const baz: MyFunc<boolean> = (a: boolean, b: boolean) => [a,b];
我正在使用通用参数来确保 1) a 和 b 扩展 Foo 和 2) a 和 b 是同一类型。
我遇到的问题是将 MyFunc 作为参数类型。我不需要 T 的确切类型;我只需要确保在调用时满足参数约束即可。例如,我想执行以下操作:
const makeArray = (qux: MyFunc) => qux(1,2);
1 和 2 属于同一类型,并且都扩展了 Foo,所以我知道函数调用会起作用,我会返回一个 number[]。但是,上面没有编译。打字稿说:
Generic type 'MyFunc' requires 1 type argument(s)
如果我使用(qux: MyFunc<any>),则根本不会进行类型检查。
是否有任何其他语法可以用来告诉 TypeScript 检查输入参数但不需要提前指定确切的类型?
【问题讨论】:
-
如果 TypeScript 不知道确切的类型,它怎么知道如何检查输入参数?
-
在调用点,它可以简单地检查 a 和 b 是否是同一类型并且它们都实现了 Foo。这足以使其类型安全,对吧?或者你能看到这样的情况是不合理的吗?
-
那么你真的只是要求默认的通用参数吗?
type MyFunc<T extends Foo = Foo> -
您可能也想使
makeArray成为通用类型,并将此通用类型传递给MyFunc,如const makeArray = <T extends Foo>(qux: MyFunc<T>) => qux(1,2)。 -
这看起来像是对泛型类型参数范围的混淆。也许您正在寻找类似 @987654321@ 的内容,其中
qux的类型实际上是通用的。如果那不是你要找的东西,你能准确地说出你的意思吗?
标签: typescript generics