我想我本质上仍然是一名C程序员。我刚刚启动了一个非常简单的助手类来清理一些调试UI:
const MaybeIfValue: React.FC<{text: string, value: any}> = ({text, value}) => {
if (value === undefined) {
return null;
}
if (value === null) {
return null;
}
return (
<div>
<span>{text}</span>{value}<br/>
</div>
);
}
...我在想,我真的不想要任何价值。实际上这并不重要,这是一个一次性的辅助函数。但多年来,在开发过程中,我多次意外地尝试渲染复杂的东西。我对Typescript还只是有一定的经验,所以我不太知道它的正确术语,但我想知道的是,我如何断言编译时类型的值是可渲染的?我把它称为C语言中的类型特征。typescript中的术语是什么?匹配?
编辑:更新示例,在看到此答案后,通过ReactChild约束泛型T。
我不能百分之百肯定我理解你的要求,但听起来你想要一个强类型的组件函数。
这是TS手册中函数页面的链接,特别是处理重载签名的部分,我在下面的片段中使用它来提供多个调用签名,每个都有自己的返回类型,取决于props.value
的类型。
TS游乐场
import {default as React, ReactChild, ReactElement} from 'react';
function MaybeIfValue (props: { text: string; value?: null | undefined }): null;
function MaybeIfValue <T extends ReactChild>(props: { text: string; value: T }): ReactElement;
function MaybeIfValue ({text, value}: { text: string; value?: unknown }) {
return (value === null || value === undefined) ? null : (
<div>
<span>{text}</span>{value}<br/>
</div>
);
};
MaybeIfValue({text: 'hello'}) // null
MaybeIfValue({text: 'hello', value: null}) // null
MaybeIfValue({text: 'hello', value: undefined}) // null
MaybeIfValue({text: 'hello', value: false}) /*
^^^^^
Error: Type 'boolean' is not assignable to type 'ReactChild'.(2769) */
MaybeIfValue({text: 'hello', value: 12}) // ReactElement
MaybeIfValue({text: 'hello', value: 'hello'}) // ReactElement
// etc...
我认为你要找的词只是“类型”。避免任何,这是一个很好的做法,因为它放弃了所有类型检查。
从技术上讲,ReactNode是可渲染的类型,但它有点过于随意,因为它似乎允许对象和函数。
ReactUNICEF
是您想要的类型,我相信。它是“可渲染的东西”的类型,通常可以放入一对{}
中。
import React, { ReactChild } from 'react'
const MaybeIfValue: React.FC<{text: string, value: ReactChild}> = ({text, value}) => {
//...
}
测验:
// Works
const goodStr = <MaybeIfValue text='good' value='foo' />
const goodNum = <MaybeIfValue text='good' value={123} />
const goodJsx = <MaybeIfValue text='good' value={<>Foo</>} />
// type errors
const badObj = <MaybeIfValue text='good' value={{ obj: true }} />
const badFn = <MaybeIfValue text='good' value={() => null} />
游戏场
此外,快速提示,您被允许使用==
而不是===
的一次是为了与null
进行比较,这对于null
和未定义
都是真实的。它节省了大量代码行。
我自己的许多组件顶部也有一条类似的线。
if (value == null) return null
假设我有以下类型: 我现在想扩展这个类型,即。 这行不通。我该怎么做?
问题内容: 我希望能够实例化一个Typescript类,在运行时可以获取该类和构造函数的详细信息。我想编写的函数将包含类名和构造函数参数。 问题答案: 您可以尝试: 编辑 此版本可在TypeScript操场上使用,例如:
我看过其他人提出的与此相关的问题,但找不到合适的答案。我希望将子对象传递给组件,然后在需要它们的地方拉出特定的子对象,我看到的大多数示例都是在相同的位置渲染子对象。 我的组件看起来像这样- 当我记录道具时。父组件中的子组件我得到一个数组,其中包含两个子组件作为对象。是否有一种简单的方法可以在我需要的地方提取特定的子对象,例如我正在使用这并不理想,因为我们将在将来动态传递子元素,并且数组长度可能会更
问题内容: React事件的正确类型是什么。最初,我只是为了简单起见而使用。现在,我正在尝试清理并避免完全使用。 所以像这样一个简单的形式: 我在这里使用什么类型作为事件类型? 似乎没有工作,因为我收到一个错误消息,并且不存在。 对于所有事件的更笼统的回答,我们将不胜感激。 谢谢 问题答案: 该SyntheticEvent接口是通用的: 并且是一般约束与的交集 。 另外,由于事件是由输入元素引起的
我希望有一个类型特征,对于任何在使用前不需要内存初始化的类型返回true,并且其复制构造函数可以作为memcpy实现。 我想让它回到真实 < li >整数类型(char、short int、int、long int等) < li >浮点数类型(float,double) < li>il::array (il::array是我自己对std::array的实现)for T是int、double、il:
和之间的区别是什么? 上述结果如下: “Point”仅指类型,但在此处用作值。 为什么会这样呢?我肯定不会使用作为值,而是使用它来实例化类型。 在哪些情况下,我需要使用,因为不合适?