在TypeScript中,您可以组合两种类型的接口类型
interface Foo {
var1: string
}
interface Bar {
var2: string
}
type Combined = Foo & Bar
我想要将键从一个接口排除到另一个接口,而不是组合键。无论如何你可以在TypeScript中做到吗?
原因是,我有一个HOC,它管理其他包装组件的属性值,如
export default function valueHOC<P> (
Comp: React.ComponentClass<P> | React.StatelessComponent<P>
): React.ComponentClass<P> {
return class WrappedComponent extends React.Component<P, State> {
render () {
return (
<Comp
{...this.props}
value={this.state.value}
/>
)
}
}
我可以写
const ValuedComponent = valueHOC(MyComponent)
然后
<ValuedComponent />
但问题是,返回的组件类型也使用来自给定组件的props类型,因此TypeScript会抱怨并要求我提供value
道具。结果,我将不得不写类似
<ValuedComponent value="foo" />
无论如何都不会使用该值。我想要的是返回没有特定键的接口,我希望有这样的东西
React.ComponentClass<P - {value: string}>
然后在返回的组件中不需要value
。现在可以在TypeScript中使用吗?
答案 0 :(得分:19)
在TypeScript 2.8中,您现在可以执行以下操作:
interface Foo {
attribute1: string;
optional2?: string;
excludePlease: string;
}
// Define Omit. Can be defined in a utilities package
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>
// Use Omit to exclude one or more fields (use "excludePlease"|"field2"|"field3" etc to exclude multiple)
type Bar = Omit<Foo, "excludePlease">
const b: Bar = {
attribute1: ''
};
因此,就您的问题而言,以下内容可能是您想要的:
export default function valueHOC<P> (
Comp: React.ComponentClass<P> | React.StatelessComponent<P>
): React.ComponentClass<Omit<P, "value">> {
return class WrappedComponent extends React.Component<Omit<P, "value">, State> {
render () {
return (
<Comp
{...this.props}
value={this.state.value}
/>
)
}
}
答案 1 :(得分:1)
interface MyDialogProps extends Omit<DialogProps, 'onClose'> {
id: string;
onClose: (reason: string) => void;
}
export const MyDialog: React.FC<MyDialogProps> = ({ id, onClose, ...props) => (
<Dialog onClose={() => onClose("whatever")} {...props} />
);
答案 2 :(得分:0)
您无法从现有界面中删除属性。即使尝试使用value
属性设置为可选的接口扩展现有接口也会返回错误。
要避免此问题,请修改目标组件的类型,以便value
属性是可选的。
e.g。
// ...
class MyComponent extends React.Component<{value?: string}, State> {
// ...
}
然后使用高阶函数时产生的组件
const valuedComponent = valueHOC(MyComponent);
不会要求value
道具。
答案 3 :(得分:0)
有utility-types个库具有Substract
映射类型:
import { Subtract } from 'utility-types';
type Props = { name: string; age: number; visible: boolean };
type DefaultProps = { age: number };
type RequiredProps = Subtract<Props, DefaultProps>;
// Expect: { name: string; visible: boolean; }