是否可以在Typescript中创建减法类型? 我正在考虑一个用户案例,当React组件仅向组件用户公开if道具的子集时。 React-redux连接示例:
import {Component, ComponentType} from 'react';
export function connect<S, A>(state: () => S, actions: A){
return function createConnected<P>(component: ComponentType<P>){
return class Connect extends Component<P-S-A>{ // <--
// ...
}
}
}
阅读后: Exclude property from type
似乎我可以使用它了...
import {Component, ComponentType} from 'react';
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
function connect<S, A>(state: () => S, actions: A) {
return function createConnect<P extends S & A>(C: React.ComponentType<P>): ComponentType<Omit<P, keyof S | keyof A>> {
return class Connect extends Component<Omit<P, keyof S | keyof A>> {
// ...
};
};
}
...。但是我不知道如何。
更新2:
更多地玩了之后,我发现了一种更简洁的方式来描述减法类型:
// LeftOuterJoin
type Subtract<T, V> = Pick<T, Exclude<keyof T, keyof V>>;
function connect<S, A>(state: () => S, actions: A) {
return function createConnect<P>(C: ComponentType<P>) {
return class Connect extends Component<Subtract<P, S & A>> {
// ...
};
};
}
答案 0 :(得分:3)
...。但是我不知道如何。
内置Exclude
类型在这里用于处理字符串文字的并集。
Exclude<keyof T, K>
从keyof T
中排除{{1}中所有键,假设K
也是字符串文字的并集-并且约束K
确保即,声明K extends keyof T
必须是K
的键的子集。
另一个内置类型Pick<T, K>
允许从T创建一个新类型,该类型仅包含T
中的键-再次假设K
是字符串文字和K
的子集。
使用keyof T
和Pick
作为构建块,您可以将一种类型的类型减法表示为“仅选择一种类型中不存在的其他属性”,其中{{1 }}对键执行“不存在”操作。
此处为展开形式,由Exclude
中的Exclude
排除了ComponentProps
或Props
中的道具:
S