我最近从基于JavaScript的react迁移到Typescript-react。所以这对我来说是新的。
我注意到Typescript有自己的使用interface
的props验证方法。我的问题是:
这是我的简单代码。下面的代码有效:
import * as React from "react";
// [Question 1] Create an object PropTypes, is this still necessary ?
import * as PropTypes from "prop-types";
// [Question 2] how to use isRequired for this prop ?
interface Props {
text: String;
active: Boolean;
}
const NavBarMenu = (props: Props) => {
// [Question 3] How to make a default value for prop?
return (
<li className="nav-item">
<a className={props.active ? "nav-link active" : "nav-link"} data-toggle="tab" href="#" role="tab">
{props.text}
</a>
</li>
);
};
NavBarMenu.propTypes = {
text: PropTypes.string.isRequired,
active: PropTypes.bool
};
export default NavBarMenu;
答案 0 :(得分:1)
打字稿
static defaultProps = {...props}
属性类型
答案 1 :(得分:1)
如果您在项目中使用TypeScript,则不需要PropTypes
包,只需使用接口即可达到相同的目的。
您可以通过界面定义必需/不需要的道具,例如:
interface MyProp {
text: String; // This value is required
active?: Boolean; // By adding ? the value becomes optional
}
为了使道具具有默认值,可以通过在组件上散布道具值来实现,例如:
const NavBarMenu = ({text, active = false}: Props) => {
// the value of active will default for false
return (
<li className="nav-item">
<a className={active ? "nav-link active" : "nav-link"} data-toggle="tab" href="#" role="tab">
{text}
</a>
</li>
);
};
希望有帮助。
答案 2 :(得分:1)
多数不。如果传递的道具类型不正确,TypeScript将抛出编译错误。 (这更好,因为PropTypes会引发运行时错误,因为像TS中那样静态类型化时,您甚至无法运行代码,因为它未经编译。因此,基本上,您无法推入生产阶段,因此没有错误。这就是重点使用静态类型语言的方法
默认情况下,在接口中写入属性是必需的(确保tsconfig中有strict: true
)。您希望active
是可选的吗?因此界面如下所示:
interface Props {
text: string;
active?: boolean;
}
(对于其他所有原始类型,{string
比String
更受青睐)
对于功能组件,这与您为任何其他常规函数中的参数定义默认值的方式没有什么不同。示例:
const NavBarMenu = ({ text, active = false }: Props) => { ... }
TypeScript也不能完全替代PropType,在大多数情况下,TS足以(甚至更好)。