TypeScript React应用程序中的PropTypes

Ral*_*lph 71 typescript reactjs react-proptypes

React.PropTypes在TypeScript React应用程序中使用是否有意义还是仅仅是"腰带和吊带"的情况?

由于组件类是使用Props类型参数声明的:

interface Props {
    // ...
}
export class MyComponent extends React.Component<Props, any> { ... }
Run Code Online (Sandbox Code Playgroud)

添加是否有任何实际好处

static propTypes {
    myProp: React.PropTypes.string
}
Run Code Online (Sandbox Code Playgroud)

到班级定义?

Joe*_*Day 63

如果要编写要由非TypeScript项目(例如组件库)使用的组件,那么这些项目将无法从基于PropTypes的类型验证中受益.

但是,如果您没有制作任何非TypeScript项目将要使用的内容,那么这是一个毫无意义的练习.现在尤其如此,TypeScript 2.4将支持JSX子类型检查(https://github.com/Microsoft/TypeScript/issues/13618).

千万记住,虽然React.PropTypes作为一个提供React.PropTypes,PropTypes.InferProps仍然是必要的,以便有传递到你的组件这些值.

我很想知道是否有一个工具可以React.PropTypes在编译时从TypeScript接口自动生成.那实在是太酷了.

  • @vehsakul 抱歉,澄清一下,如果您正在编写一个将由不使用 TypeScript 的开发人员安装的包,他们仍然需要 PropTypes 以便在运行时出现错误。如果您的项目仅用于您自己/其他 TypeScript 项目,那么您的道具的 TypeScript 接口就足够了,因为该项目根本无法构建。 (2认同)

小智 42

Typescript和PropTypes具有不同的用途。Typescript在编译时验证类型,而PropTypes在运行时检查。

Typescript在编写代码时很有用:如果将错误类型的参数传递给React组件,为函数调用提供自动完成功能等,它将警告您。

当您测试组件如何与外部数据交互时,例如从API加载JSON时,PropTypes很有用。PropTypes将通过打印如下有用的消息来帮助您调试(在React的开发模式下)组件失败的原因:

Warning: Failed prop type: Invalid prop `id` of type `number` supplied to `Table`, expected `string`
Run Code Online (Sandbox Code Playgroud)

即使看起来Typescript和PropTypes做相同的事情,它们实际上根本没有重叠。但是可以从Typescript自动生成PropType,这样您就不必两次指定类型,例如:

  • “Typescript 和 PropTypes 有不同的用途。Typescript 在编译时验证类型,而 PropTypes 在运行时检查。” --- 编译时和运行时的_目的_没有不同。它们的类型不同,目的相同,而且编译时间更短。 (4认同)
  • 这是正确的答案!PropTypes(运行时)与静态类型检查(编译时)不同。因此,两者都不是“毫无意义的练习”。 (3认同)
  • propTypes 和 Typescript 类型容易不同步吗?有没有人有维修经验可以告诉我们吗? (2认同)
  • @Julia,热重载与运行时没有任何共同之处。即使使用热重载,你也不知道 api 真正返回什么 (2认同)

thi*_*ign 13

正如@afonsoduarte 所说。

我只想补充一点,您还可以像这样从 PropTypes 生成 Typescript 类型:

const propTypes = {
  input: PropTypes.shape({
    id: PropTypes.number.isRequired,
    name: PropTypes.string.isRequired,
  }),
};

type MyComponentProps = PropTypes.InferProps<typeof propTypes>;

const MyComponent: FunctionComponent<MyComponentProps > = (props) => {
  // ...
}

MyComponent.propTypes = propTypes;
Run Code Online (Sandbox Code Playgroud)

  • @maroofshittu 我一直在我严格的 TS 项目中使用它,并且工作得很好,包括复杂的场景。 (2认同)

Tom*_*ech 6

我想在编译时无法推断道具类型的一些混乱情况下,查看propTypes在运行时使用生成的任何警告会很有用。

一种这样的情况是在处理来自类型定义不可用的外部源的数据时,例如您无法控制的外部 API。对于内部 API,我认为编写(或更好地生成)类型定义是值得的,如果它们尚不可用的话。

除此之外,我真的没有看到任何好处(这就是为什么我从来没有亲自使用过它)。

  • PropTypes 验证对于验证动态加载的数据结构(通过 AJAX 来自服务器)也很有意义。PropTypes 是运行时验证,因此可以真正帮助调试东西。因为问题会输出清晰且人性化的信息。 (9认同)

小智 6

@types/prop-types中的“ InferPropTypes ”可用于根据 PropTypes 定义创建类型定义。检查下面的例子

import React from "react";
import PropTypes, { InferProps } from "prop-types";

const ComponentPropTypes = {
    title: PropTypes.string.isRequired,
    createdAt: PropTypes.instanceOf(Date),
    authorName: PropTypes.string.isRequired,
};

type ComponentTypes = InferProps<typeof ComponentPropTypes>;
const MyComponent = ({ authorName, createdAt, title }: ComponentTypes) => {
    return <span>Blog Card</span>;
};

MyComponent.propTypes = ComponentPropTypes;
export default MyComponent;
Run Code Online (Sandbox Code Playgroud)