使用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不在使用时一样,但我找不到这样做的魔法酱料。
有谁比我聪明能搞清楚吗?
4条答案
按热度按时间5f0d552i1#
当你只有一个类型参数时,TypeScript不能确定它是否是JSX的开始标记,它必须选择一个,所以它选择了JSX。
如果你想要一个语义完全相同的函数,你可以显式地列出
T
的约束:这打破了TypeScript的多义性,使您可以使用泛型类型参数。它还具有相同的语义,因为类型参数始终具有
{}
的隐式约束。ss2ws0br2#
解决方法是添加尾随逗号:
af7jpaap3#
我个人使用
extends unknown
。听起来对我来说最安全2o7dmzc54#
我想不出一个解决办法,我会和你一样高兴地知道一个。
然而,这里有一个不同的方法来实现相同的:
编译器不会抱怨泛型。