【问题标题】:TypeScript won't select the right overrideTypeScript 不会选择正确的覆盖
【发布时间】:2019-11-03 05:19:27
【问题描述】:

我刚刚创建了一个动态组件,应该如下所示:

/* 应该继承所有 InputComponent 属性。 DefaultComponent 应该是默认的组件道具值。 */

<DynamicComponent component={InputComponent} />

我当前的实现如下所示:

type DefaultProps = { defaultProp: string }
type InputProps = { onChange: () => void }
type DynamicType<P> = DynamicProps & { component: ReactType<P> } & P

export default function DynamicComponent(props: DynamicProps & { component?: DefaultComponent } & DefaultComponentProps): ReactElement<DefaultComponentProps>
export default function DynamicComponent<P>(props: DynamicType<P>): ReactElement<P> {
    const { style: overrideStyle, component } = props
    const { style } = getStyle(props)
    const mergedStyle = { ...style, ...overrideStyle }
    return React.createElement(component, { ...props, style: mergedStyle })
};

DynamicComponent.defaultProps = { component: DefaultComponent }

所以我希望接下来会发生:

1.) 当组件未定义时,我期望第一个覆盖(默认覆盖)

<DynamicComponent defaultProps='itsTotallyValid' /> // valid

2.) 定义组件后,我希望继承它的属性

<DynamicComponent component={InputComponent} onChange={() =>{}} /> // valid

由于某种原因,第二种情况永远不会发生,它总是选择第一种。有没有办法更严格,所以我可以强制第二种情况成为可能?

更新

示例:https://codesandbox.io/s/quiet-architecture-zx60y

【问题讨论】:

  • 为什么有两个函数声明?
  • 是的,这是我想要前进的一种方式,但如果我能用一个组件解决这个问题会更好。 (否则我可以使用 DefaultDynamicComponent + DynamicComponent)
  • Typescript 支持泛型的默认值。您可以提供&lt;P = DefaultComponent&gt;
  • 问题是,由于我的泛型有点来自推断道具类型并从它继承,我不能真正为泛型添加默认值:type DynamicType

    = DynamicProps & { component: ReactType

    } & P

  • 你能发帖吗,DynamicProps

标签: reactjs typescript typescript-typings typescript-generics react-tsx


【解决方案1】:

解决 cmets 中关于默认泛型类型阻塞类型推断的问题,但事实并非如此,下面的最小示例演示了类型推断适用于类型 T 的默认值 string

function Bar<T = string>(props: { component: T }) : T {
  return props.component
}

Bar({ component : 'string' })
Bar({ component : 5 }) // <-- Type inferred to be number

【讨论】:

  • 嗯,是的,所以这不是因为推断类型不起作用:/ 一秒
  • 刚刚做了一个例子。
  • 这很奇怪,但是你有一个重要的案例,显式组件现在工作。我会继续调查这个
  • 不错,如果您发现任何东西,请告诉我:)。这总是让我恼火......:D
猜你喜欢
  • 2023-04-10
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
  • 2020-05-12
  • 2012-11-15
  • 2017-07-09
  • 1970-01-01
  • 2022-06-19
相关资源
最近更新 更多