打字稿从省略类型重建原始类型

时间:2019-10-05 23:49:13

标签: typescript

在打字稿3.5中,Omit helper is added。 假设第三方API提供以下接口和功能:

interface Params {
    n: number;
    s: string;
    b: boolean;
    on: number;
    os: string;
    ob: boolean;
}

function api(params: Params) {...}

我想为api写一个包装器,这样我只需要向其余代码库公开有趣的属性即可。

function wrapper(params: Omit<Params, 'on' | 'os' | 'ob'>) {
    (params as Params).on = 1;
    (params as Params).os = 'foo';
    (params as Params).ob = false;
    api(params as Params);
}

由于使用as,对我来说这似乎是一种黑客。做到这一点的最优雅的方法是什么

  1. 类型检查通过
  2. 如果我为省略的属性(例如params.on = 'bar';)分配了错误的类型,则类型检查可以捕获。
  3. 如果我错过任何遗漏的属性(例如,包装中未分配on),类型检查可以捕获。在当前实现中不会捕获此类型。

1 个答案:

答案 0 :(得分:0)

您可以想到两种选择:

// Option 1: Object spread
type WrapperParms = Omit<Params, 'on' | 'os' | 'ob'>;
function wrapper(params: WrapperParms) {
    return api({
      on: 1,
      os: 'foo',
      ob: false,
      ...params
    });
}

// Option 2: Optionals + default values + Object spread
type FilteredParams = 'on' | 'os' | 'ob';
type OptionalParams = Partial<Pick<Params, FilteredParams>>;
type WrapperParams2 = Omit<Params, FilteredParams> & OptionalParams;
function wrapper2(params: WrapperParams2) {
    // assign default values to optional parameters
    const {on = 1, os = 'foo', ob = false, ...rest} = params;
    return api({
      on,
      os,
      ob,
      ...rest
    });
}

使用第二个选项,类型定义可能看起来更复杂,但它们为包装函数的用户提供了更大的灵活性。这样可以将省略的属性有效地转换为可选属性,因此它们可以提供包装参数的替代值。