1

是否有可能在 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>{ // <-- 
      // ...
    }    
  }
}

阅读后: 从类型中排除属性

似乎我得到了这个工作......

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>> {
                  // ...
        };
    };
}
4

1 回答 1

4

....但我不明白怎么做。

内置Exclude类型在这里用于对字符串文字的联合进行操作。

Exclude<keyof T, K>排除keyof T其中的所有键 in K,假设它K也是字符串文字的联合 - 并且约束K extends keyof T确保,声明它K必须是 的键的子集T

另一种内置类型 ,Pick<T, K>允许从 T 创建一个新类型,该类型仅具有在K- 中的键,假设它K是字符串文字和 的子集的联合keyof T

使用PickandExclude作为构建块,您可以将一种类型与另一种类型的类型减法表示为“仅从一种类型中选择这些属性,而这些属性在另一种类型中不存在”,Exclude并对键执行“不存在”操作。

这里它是扩展形式,ComponentProps通过排除orProps中的道具:SA

type ComponentProps = Pick<Props, Exclude<keyof Props, keyof S | keyof A>>
于 2018-08-07T00:02:09.910 回答