我们正在为我们的内部应用程序创建一个组件库。这个库的旧版本是用JavaScript和JSX编写的,因此为了类型安全,我们已经为所有组件声明了propTypes。
组件库的更新版本是用TypeScript编写的。为了类型安全,我们为PropTypes使用了接口,如-
interface Props {
size?: 'small' | 'large';
color?: string;
text?: string;
}
export class MyComponent extends React.Component<Props, any> { ... }这很好,因为使用这些组件的新项目也是用TypeScript编写的(我们确实为所有组件类发布了d.ts文件)。现在,我们还需要更新旧项目中的组件库。由于他们没有使用TypeScript,所以这种类型的安全性就不起作用。他们仍然依赖旧的propTypes方式来实现类型安全。
//Usage of MyComponent
<MyComponent size={20} color={'red'} text={'HelloWorld'} />
//Size must be one of 'small' or 'large' not the numeric value.那么,我的问题是,在一个非类型文本项目中使用TypeScript (和tsx)书面组件的方法是什么?
我已经确定了一些方法-
有没有其他更清洁、更少人工的方法?
发布于 2019-01-23 14:07:29
一个完美的问题!我自己也在调查这个问题。
首先,我同意TypeScript不是PropTypes 100%的替代品,因为:
我的搜索向我展示了以下可能性:
它允许在PropTypes编译期间实际生成TypeScript。它作为巴贝尔的插件。缺点是您必须使用Babel才能使用此功能。事实上,我发布了一个问题:不用Babel的插件?,但我怀疑这是否可能。
正如我从文档中看到的,这不是一个完全兼容的PropTypes生成器,而是一个替代器,它使用自己的实现在运行时进行类型检查。不过,我希望我的PropTypes与官方实现完全兼容。
您必须选择哪些是您可以接受的,以及您的项目的需求是什么。如果你对使用Babel很满意,我会推荐第一种选择。但是,如果您只需要确保类型检查在运行时有效,那么第二种方法可能是可行的。
至于我,我认为我现在必须同时保持TypeScript类型和手动PropTypes的同步,因为我不使用Babel,我不太喜欢定制的PropTypes实现。
也许,在阳光明媚的一天,我们会找到一些资源,在我们的公司编写自己的PropTypes生成器,并与每个人分享。
下面是一个可以用来保持PropTypes与类型同步的输入技巧:
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对象具有与支持接口完全相同的属性。
https://stackoverflow.com/questions/54060057
复制相似问题