首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为用PropTypes编写的React组件生成TypeScript

为用PropTypes编写的React组件生成TypeScript
EN

Stack Overflow用户
提问于 2019-01-06 09:01:57
回答 1查看 6.6K关注 0票数 12

我们正在为我们的内部应用程序创建一个组件库。这个库的旧版本是用JavaScriptJSX编写的,因此为了类型安全,我们已经为所有组件声明了propTypes

组件库的更新版本是用TypeScript编写的。为了类型安全,我们为PropTypes使用了接口,如-

代码语言:javascript
复制
interface Props {
    size?: 'small' | 'large';
    color?: string;
    text?: string;
}
export class MyComponent extends React.Component<Props, any> { ... }

这很好,因为使用这些组件的新项目也是用TypeScript编写的(我们确实为所有组件类发布了d.ts文件)。现在,我们还需要更新旧项目中的组件库。由于他们没有使用TypeScript,所以这种类型的安全性就不起作用。他们仍然依赖旧的propTypes方式来实现类型安全。

代码语言:javascript
复制
//Usage of MyComponent
<MyComponent size={20} color={'red'} text={'HelloWorld'} />
//Size must be one of 'small' or 'large' not the numeric value.

那么,我的问题是,在一个非类型文本项目中使用TypeScript (和tsx)书面组件的方法是什么?

我已经确定了一些方法-

  • 对d.ts文件使用解析器
  • 为所有组件创建一个HoC
  • 手动为所有组件编写propTypes和接口。

有没有其他更清洁、更少人工的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-23 14:07:29

一个完美的问题!我自己也在调查这个问题。

首先,我同意TypeScript不是PropTypes 100%的替代品,因为:

  1. 如果您正在构建一个库,并且它是由一个普通的JavaScript项目使用的,那么输入无法帮助检测所有的问题。
  2. PropTypes在运行时动态工作,而TypeScript检查只能静态运行。
  3. PropTypes可用于在运行时获取有关组件的信息,而类型定义则在运行时丢失。

我的搜索向我展示了以下可能性:

它允许在PropTypes编译期间实际生成TypeScript。它作为巴贝尔的插件。缺点是您必须使用Babel才能使用此功能。事实上,我发布了一个问题:不用Babel的插件?,但我怀疑这是否可能。

正如我从文档中看到的,这不是一个完全兼容的PropTypes生成器,而是一个替代器,它使用自己的实现在运行时进行类型检查。不过,我希望我的PropTypes与官方实现完全兼容。

您必须选择哪些是您可以接受的,以及您的项目的需求是什么。如果你对使用Babel很满意,我会推荐第一种选择。但是,如果您只需要确保类型检查在运行时有效,那么第二种方法可能是可行的。

至于我,我认为我现在必须同时保持TypeScript类型和手动PropTypes的同步,因为我不使用Babel,我不太喜欢定制的PropTypes实现。

也许,在阳光明媚的一天,我们会找到一些资源,在我们的公司编写自己的PropTypes生成器,并与每个人分享。

下面是一个可以用来保持PropTypes与类型同步的输入技巧:

代码语言:javascript
复制
import * as PropTypes from 'prop-types';
import React, {PureComponent} from 'react';


export interface IconProps {
  name: string;
}

export class Icon extends PureComponent<IconProps> {

  static propTypes: { [key in keyof IconProps]: any } = {
    name: PropTypes.string
  };

  render() {
    return <i className="dc-icon">{this.props.name}</i>;
  }

}

这将迫使propTypes对象具有与支持接口完全相同的属性。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54060057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档