打字稿:由数组提供的键的部分接口

时间:2018-03-18 13:59:11

标签: typescript typescript-typings

我正在针对web api进行编程,对于某些字段,只有在查询中指定它们时才会返回它们。

{a:"hello", b:"world", c:"of goo", d:"i am always present"}

我打电话给

api.getResponse(["a","b"])

我会得到

{a:"hello", b:"world", d:"i am always present"}

作出回应。

我如何用打字稿的类型语言表达?

2 个答案:

答案 0 :(得分:2)

您可以在单独的界面上声明始终存在和可选字段,然后使用Pick选择正确的字段:

interface AlwaysPresentFields {
    d: string;
}

interface OptionalFields {
    a: string;
    b: string;
    c: string;
}

type ApiResponse<F extends keyof OptionalFields> = AlwaysPresentFields & Pick<OptionalFields, F>;

function getResponse<F extends keyof OptionalFields>(fields: F[]): ApiResponse<F> {
    // Implementation
}

答案 1 :(得分:0)

在高级类型脚本中,我们可以使用部分,选择,只读。

根据您的情况,可以使用 keyof,部分 。也可以使用 Pick 来实现相同的目的:docs

interface IResponse {
  a: string;
  b: string;
  c: string;
  d: string;
}

const getResponse = (responseKeys: Array<keyof IResponse>): Partial<IResponse> => {
  const responseWithFilteredKeys: Partial<IResponse> = {};
  const response: IResponse = {
    a: 'a',
    b: 'a',
    c: 'a',
    d: 'a',
  };
  responseKeys.forEach((key: keyof IResponse) => {
    responseWithFilteredKeys[key] = response[key];
  });
  return responseWithFilteredKeys;
};

const filterdUserResponse: Partial<IResponse> = getResponse(['a', 'b']);