TypeScript React应用程序中的PropTypes


121

React.PropTypes在TypeScript React Application中使用有意义吗?还是“皮带和吊带”的情况?

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

interface Props {
    // ...
}
export class MyComponent extends React.Component<Props, any> { ... }

有添加任何真正的好处吗

static propTypes {
    myProp: React.PropTypes.string
}

对类的定义?

Answers:


104

将两个组件道具同时保持为TypeScript类型通常没有太大价值React.PropTypes

在某些情况下,这样做很有用:

  • 发布将由普通JavaScript使用的包,例如组件库。
  • 接受并传递外部输入,例如API调用的结果。
  • 使用库中可能没有正确或正确键入的数据(如果有)。

因此,通常这是您可以信任编译时间验证多少的问题。

现在,较新版本的TypeScript可以根据您的React.PropTypesPropTypes.InferProps)推断类型,但是生成的类型可能难以使用或在代码的其他地方引用。


1
您能解释一下第一句话吗?
vehsakul

2
@vehsakul抱歉,为澄清起见,如果您编写的软件包将由不使用TypeScript的开发人员安装,则他们仍然需要PropTypes才能在运行时获取错误。如果您的项目仅适合您自己/其他TypeScript项目,则道具的TypeScript接口就足够了,因为该项目根本无法构建。
乔尔·戴

1
这是一个POC,可从Webpack级别的打字稿接口添加PropTypes github.com/grncdr/ts-react-loader#what-it-does
borN_free

我想要一个oneOfType-optionalUnion:PropTypes.oneOfType([PropTypes.string,PropTypes.number,PropTypes.instanceOf(Message)]),-打字稿具有联合类型,但它们并不能给我同样的感觉
Mz一个

1
我已经发布了一个执行此操作的库:github.com/joelday/ts-proptypes-transformer 作为TypeScript编译器转换实现的,它为深泛型,并集等生成准确的propTypes。存在一些粗糙的地方,因此任何贡献都将是美好的。
乔尔·戴

138

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`

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


propTypes和Typescript类型是否容易不同步?有没有维修经验告诉我们?
莱昂纳多·

9
这是正确的答案!PropTypes(运行时)与静态类型检查(编译时)不同。因此,同时使用这两种方法不是“毫无意义的练习”。
汉斯

1
关于如何从PropTypes推断静态类型,这是一个很好的解释: dev.to/busypeoples/…–
汉斯,

当您使用热重载和eslint进行vue cli时,运行时vs编译时间没有任何意义。保存时会产生错误。
朱莉娅

1
@Julia,热重装与运行时没有任何共同之处。即使进行热装,您也不知道api真正返回的内容是什么
Kostya Tresko

4

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

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

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


7
PropTypes验证对于验证动态加载的数据结构(来自服务器,通过AJAX)也很有意义。PropTypes是运行时验证,因此确实可以帮助调试内容。由于问题将输出清晰且人性化的消息。
e1v
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.