reactjs 如何在带React的Typescript/JSX中使用带箭头函数的泛型?

hvvq6cgz  于 2022-12-22  发布在  React
关注(0)|答案(4)|浏览(172)

使用Typescript,在Visual Studio中键入,“ts”文件,请考虑以下声明:

export const foo = <T>(myObject: T) => myObject.toString();

这工作正常,类型检查正常,一切都很好。
现在,将完全相同的代码放入一个用于JSX和React的“.tsx”文件中。
Intellisense非常生气并抱怨,因为它试图将变成一个React JSX元素,但我的意图是让编译器将其视为泛型类型指示符。
编译器抱怨:
[gulp-typescript] 17008 JSX元素'T'没有对应的结束标记。
我尝试了许多语法上的变通方法,试图让IDE和编译器都让我避开JSX,并迫使编译器将理解为泛型,就像JSX不在使用时一样,但我找不到这样做的魔法酱料。
有谁比我聪明能搞清楚吗?

5f0d552i

5f0d552i1#

当你只有一个类型参数时,TypeScript不能确定它是否是JSX的开始标记,它必须选择一个,所以它选择了JSX。
如果你想要一个语义完全相同的函数,你可以显式地列出T的约束:

const foo = <T extends {}>(myObject: T) => myObject.toString();

这打破了TypeScript的多义性,使您可以使用泛型类型参数。它还具有相同的语义,因为类型参数始终具有{}的隐式约束。

ss2ws0br

ss2ws0br2#

解决方法是添加尾随逗号:

export const foo = <T,>(myObject: T) => myObject.toString();
af7jpaap

af7jpaap3#

我个人使用extends unknown。听起来对我来说最安全

const foo = <T extends unknown>(myObject: T) => myObject.toString();
2o7dmzc5

2o7dmzc54#

我想不出一个解决办法,我会和你一样高兴地知道一个。
然而,这里有一个不同的方法来实现相同的:

export const foo = function<T>(myObject: T) { return myObject.toString(); }

编译器不会抱怨泛型。

相关问题