当前位置: 首页 > 面试题库 >

如何在带有React的Typescript / JSX中使用带有箭头功能的泛型?

邓星光
2023-03-14
问题内容

使用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一样。但是我找不到神奇的调料来做到这一点。

有比我聪明的人可以解决这个问题吗?


问题答案:

当您具有单个类型参数时,TypeScript不确定它是否可能是JSX开头标记。它必须选择一个,所以它与JSX一起使用。

如果您想要一个具有完全相同语义的函数,则可以显式列出以下约束T

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

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



 类似资料:
  • 问题内容: 我在React中使用Typescript。我在理解如何使用refs方面遇到麻烦,以便相对于refs引用的react节点获得静态类型和智能感知。我的代码如下。 问题答案: 如果您使用的是React 16.3+,建议的创建引用的方法是使用。 组件安装后,属性的属性将分配给引用的组件/ DOM元素,并在卸载时分配回该属性。因此,例如,您可以使用进行访问。 有关更多信息,请参见@apieceo

  • 问题内容: 结合使用TypeScript和React,我们不再需要扩展,以使编译器知道所有react组件prop都可以有子代: 但是,无状态功能组件似乎并非如此: 发出编译错误: 错误:(102、17)TS2339:类型“ MyProps”上不存在属性“子级”。 我猜这是因为编译器实际上没有办法知道在props参数中将提供香草函数。 所以问题是我们应该如何在TypeScript的无状态功能组件中使

  • 使用带有React的TypeScript,我们不再需要扩展,以便编译器知道所有React组件Props都可以有子级: 然而,无状态功能组件似乎不是这样: 发出编译错误: 错误:(102,17)TS2339:类型“MyProps”上不存在属性“children”。 我想这是因为编译器真的无法知道在props参数中会给出

  • 问题内容: 我正在将ReactJS与Babel和Webpack一起使用,并使用ES6以及针对箭头功能的建议类字段。我知道箭头函数通过不重新创建每个呈现的函数(类似于构造函数中的绑定工作方式)来使事情更高效。但是,我不确定100%是否正确使用了它们。以下是我的代码在三个不同文件中的简化部分。 我的代码: Main.js SecondClass.js ThirdClass.js 题: 我上面的代码使用

  • 问题内容: 我正在将ReactJS与Babel和Webpack一起使用,并使用ES6以及针对箭头功能的建议类字段。我知道箭头函数通过不重新创建每个呈现的函数(类似于构造函数中的绑定工作方式)来使事情更高效。但是,我不确定100%是否正确使用了它们。以下是我的代码在三个不同文件中的简化部分。 我的代码: Main.js SecondClass.js ThirdClass.js 题: 我上面的代码使用

  • 问题内容: 鉴于此组件: 如何添加一个无需使用语法即可定义状态的构造函数? 问题答案: 由于它是一个无状态组件,因此没有组件生命周期。因此,您不能指定。 您必须进行扩展以创建有状态组件,然后需要一个构造函数,并且可以使用。 更新 由于阵营16.8.0和挂钩得到了引入有更多的选择。 挂钩是一项新的功能建议,使您无需编写类即可使用状态和其他React>功能。它们作为> v16.8.0的一部分在Reac