我有反应代码
导出默认类 MyComponent 扩展组件
问题是,我写的道具是
类型
还是接口
?
type Props = {
isActive: Boolean,
onClick: Function
}
或
interface Props {
isActive: Boolean,
onClick: Function
}
另外,当我不使用typescript,而是使用经典的webpack babel设置时,方向是什么?
或者,这对我来说很重要吗?
接口比相应的类型声明更强大一些,但是对于一组react道具来说,这可能无关紧要。你可以在这个问题中读到类型和接口之间的区别。
由于您不太可能扩展该接口或在其他地方对其进行扩展,因此使用任何一个都可能没问题。但我想说的是,接口通常是定义对象类型的首选,因为它们更灵活一些。
现在是2020年,在几乎所有带有React
道具的情况下,我都会喜欢type
(这里是一般类型vs接口帖子)。只能用类型别名表示的常见情况:
// given some props from another comp that are to be altered
type ExternalProps = { a: string; b: { c: number } };
type Props_IndexType = ExternalProps["b"]; // { c: number; }
type Props_MappedType = { [K in keyof ExternalProps]: number }; // { a: number; b: number; }
type Props_DiscriminatedUnionType = { tag: "tag1"; foo: string } | { tag: "tag2"; foo: boolean}
type Props_typeOf = { foo: string } & typeof defaultProps; // see class comp example
// conditional types - ok, this one is a bit contrived, but you get the point
type Props_ConditionalType<T> = T extends true ? { a: string } : { b: number };
const Comp = <T extends {}>(props: Props_ConditionalType<T>) =>
<div>{"a" in props && (props as any).a}</div>
render(<Comp<true> a="foo" />, document.getElementById("root"));
用于说明的类组件示例(OP提到了它们,但以上情况也适用于钩子):
// cannot do that with interfaces
type Props = ({ tag: "tag1"; foo: string } | { tag: "tag2"; foo: boolean }) &
typeof defaultProps;
type State = typeof initState;
const defaultProps = { a: "A" };
const initState = { c: "C" };
class App extends React.Component<Props, State> {
static readonly defaultProps = defaultProps;
state = initState;
render() { ... }
}
render(<App tag="tag1" foo="foo" />, document.getElementById("root"));
唯一的情况是,我会考虑接口:
我有一个组件,根据其大小接收道具。道具可以是字符串或数字,例如:或。 我能让知道这可以是PropTypes验证中的一个或另一个吗? 如果未指定类型,则会收到警告: prop type无效;它必须是一个函数,通常来自React。道具类型。
我见过多个使用Typescript的React组件示例: +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++组件 当我们不使用道具或国家时,似乎没有一个明确的惯例。 人们将这些类型设置为,,,, ,等等。这是我到目前为止看到的:
有没有一种最佳实践可以将函数类型与React prop类型和TypeScript结合使用? 我以为这会奏效,但事实上它错了: 按照这个思路,我让它工作了,但它似乎不必要地冗长:https://github.com/Microsoft/TypeScript/issues/20007
我收到警告“警告:失败的道具类型:提供给的类型为
我在许多组件中使用了几个大型对象,因此我为每个大型对象创建了一个proptypes文件,如下所示: 其中包含从"prop类型"导入PropType; 我在组件中使用对象,如下所示: 它给我一个警告,Prop类型“PropLargeObject”无效,它必须是一个函数,通常来自React。道具类型。我做错了什么?
我有一个React组件,它获取一个配置对象作为道具,它看起来像这样: 在某些情况下,我希望通过使用传入另一个对象来禁用组件显示的功能,如下所示: 这工作正常,不是问题。 但是,我还希望确保使用我的组件的客户端代码提供正确的配置对象: 如果active为true,则需要foo 如果active为false,则foo是可选的,不需要提供 我如何为这样的情况定义道具类型? 我试过: 但这给了我以下警告: