赋予TypeScript泛型函数访问类型变量的权限



在TypeScript中使用泛型时,具有泛型类型参数的函数访问该类型通常很有用。有一种标准模式可以用命名函数来实现这一点:

interface TestInterface<T> {
foo: (input: T) => string;
};
const interfaces: TestInterface<string>[] = [
{foo: (x: string) => `foo-${x}`},
{foo: (x: string) => `bar-${x}`},
];
function func<T>(x: T, index: number): string {
const int: TestInterface<T> = interfaces[index];
return `ack-${int.foo(x)}`
}

然而,尝试用匿名函数做类似的事情似乎并不奏效:

const func: <T>(x: T, index: number) => string = (x, index) => {
const int: TestInterface<T> = interfaces[index];
return `ack-${int.foo(x)}`
}

后一次尝试未通过tsc检查,表示";找不到名称"T"当我们试图指定CCD_ 1的类型时。

虽然这显然是一个高度简化的示例,但在许多情况下,需要在函数定义中实际访问T。虽然使用命名函数是一种简单的解决方法,但在强烈喜欢更现代风格的代码库中,这在风格上很奇怪;有什么方法可以使用匿名函数来实现这一点吗?如果没有,这是否应该在tsc中解决?

有一个训练允许在匿名函数中使用泛型类型。虽然对于普通TS用户来说,它可能看起来不太正统,但它最终运行得很好。

您可以使用关键字unknown来定义一些通用的东西。在这种情况下,您可以在匿名函数定义中使用T extends unknown

const func: <T extends unknown>(x: T, index: number) => string = (x, index) => { /* ... */ });

这将允许您在参数中使用泛型类型。

不可能在匿名函数中直接使用T作为类型(我不知道为什么(。但是,由于参数x使用T作为类型,因此可以使用关键字typeof来使用它的类型(最终为T(。

const func: <T extends unknown>(x: T, index: number) => string = (x, index) => {
const int: TestInterface<typeof x> = interfaces[index];
return `ack-${int.foo(x)}`
}

这种语法似乎在打字游戏中起作用。

你可以这样调用函数:

func<string>('test', 1); 

我不确定这是否能回答你的问题,但这是我能找到的最好的答案。

这个怎么样:

const func = <T>(x: T, index: number): string => {
const int: TestInterface<T> = interfaces[index];
return `ack-${int.foo(x)}`
}

最新更新