当前位置: 首页 > 知识库问答 >
问题:

类型化反应 - 道具作为“类型”或“接口”

晏鸿畅
2023-03-14

我有反应代码

导出默认类 MyComponent 扩展组件

问题是,我写的道具是类型还是接口

type Props = {
    isActive: Boolean,
    onClick: Function
}

interface Props {
    isActive: Boolean,
    onClick: Function
}

另外,当我不使用typescript,而是使用经典的webpack babel设置时,方向是什么?

或者,这对我来说很重要吗?


共有2个答案

邢凯歌
2023-03-14

接口比相应的类型声明更强大一些,但是对于一组react道具来说,这可能无关紧要。你可以在这个问题中读到类型和接口之间的区别。

由于您不太可能扩展该接口或在其他地方对其进行扩展,因此使用任何一个都可能没问题。但我想说的是,接口通常是定义对象类型的首选,因为它们更灵活一些。

毛弘博
2023-03-14

现在是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"));

唯一的情况是,我会考虑接口:

  • 您在全局范围内对prop类型进行声明合并(现在不常见)
  • 您想隐藏类型实现详细信息,因为接口会创建错误消息、IDE类型信息等中使用的新名称。(文档)
 类似资料:
  • 我有一个组件,根据其大小接收道具。道具可以是字符串或数字,例如:或。 我能让知道这可以是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是可选的,不需要提供 我如何为这样的情况定义道具类型? 我试过: 但这给了我以下警告: