【发布时间】:2019-06-26 11:20:21
【问题描述】:
通过 HOC 传递组件会导致 defaultProps 信息丢失给 typescript 编译器。比如
themed.tsx
export interface ThemedProps {
theme: {};
}
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
export type Subtract<T extends K, K> = Omit<T, keyof K>;
const themed = <P extends ThemedProps = ThemedProps>(
ComponentToWrap: React.ComponentType<P>
) => {
return class ThemeWrappedComponent extends React.Component<
Subtract<P, ThemedProps>
> {
static displayName = `themed(${ComponentToWrap.displayName})`;
theme = () => {
return {}
};
render() {
return (
<ComponentToWrap
{...this.props as P}
theme={this.theme()}
/>
);
}
}
};
Foo.tsx
interface FooProps {
theme: object,
name: string,
}
class Foo extends React.Component<FooProps> {
static defaultProps = {
name: 'world'
}
render() {
return <span>hello ${this.props.name}</span>
}
}
export default themed(Foo);
当我实例化 <Foo /> 时,我收到一个编译器错误,提示 Property 'name' is missing in type '{}' but required in type 'Readonly<Pick<FooProps, "name">>'.。
我知道有一种方法可以使用 JSX.LibraryManagedAttributes 来解决这种问题,但我不知道如何,也找不到任何关于该功能的文档。
【问题讨论】:
标签: javascript reactjs typescript higher-order-components