我正在尝试在 TypeScript 中编写一个高阶组件,它接受一些 React 组件类,包装它,并返回一个省略了声明属性之一的类型。这是我尝试过的:
interface MyProps {
hello: string;
world: number;
}
interface MyState { }
function HocThatMagicallyProvidesProperty<P, S, T extends {new(...args:any[]): React.Component<Exclude<P, "world">, S>}>(constructor: T): T {
throw new Error('test');
}
const MyComponent = HocThatMagicallyProvidesProperty(class MyComponent extends React.Component<MyProps, MyState> {
constructor(props: MyProps, context: any) {
super(props, context);
}
public render() {
return <div></div>;
}
})
function usingThatComponent() {
return (
<MyComponent
hello="test"
/>
);
}
但是,在使用组件时出现错误:
输入'{你好:字符串; }' 不可分配到类型 'IntrinsicAttributes & IntrinsicClassAttributes & Readonly<{ children?: ReactNode; }>...'。输入'{你好:字符串; }' 不可分配给类型 'Readonly'。类型“{ hello: string;”中缺少属性“world” }'。
我也试过这个 HOC 声明:
function HocThatMagicallyProvidesProperty<P, S, T extends {new(...args:any[]): React.Component<P, S>}>(constructor: T): {new(...args:any[]): React.Component<Exclude<P, "world">, S>} {
throw new Error('test');
}
但是,这既不适用于类的使用,也不适用于实际的 HOC 调用。
如何定义高阶组件,以便world
在使用类时不必传入属性?