当前位置: 首页 > 知识库问答 >
问题:

可渲染的“类型特征”在打字稿中的反应?

逑兴安
2023-03-14

我想我本质上仍然是一名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中的术语是什么?匹配?

共有2个答案

况谦
2023-03-14

编辑:更新示例,在看到此答案后,通过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...
庾才
2023-03-14

我认为你要找的词只是“类型”。避免任何,这是一个很好的做法,因为它放弃了所有类型检查。

从技术上讲,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”仅指类型,但在此处用作值。 为什么会这样呢?我肯定不会使用作为值,而是使用它来实例化类型。 在哪些情况下,我需要使用,因为不合适?