打字稿减去类型

时间:2018-08-06 20:48:37

标签: reactjs typescript react-redux tsx

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

1 个答案:

答案 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 TPick作为构建块,您可以将一种类型的类型减法表示为“仅选择一种类型中不存在的其他属性”,其中{{1 }}对键执行“不存在”操作。

此处为展开形式,由Exclude中的Exclude排除了ComponentPropsProps中的道具:

S