为什么我无法使用扩展运算符输入参数?

时间:2019-07-18 10:02:16

标签: javascript typescript api github octokit

通过使用Octokit包,我想列出所有拉取请求(client.pulls.list)。

我有一个GitHubClient(用于Octokit的包装)和GitHubService(用于GitHubClient的包装)。 GitHubService的options参数使用具有perPage?: number;属性的接口,而GitHubClient接受具有属性per_page?: number;的接口的选项

在下面的代码中,我在GitHubClient类中丢失了options的类型检查。

我做错了什么以及如何正确设置选项类型?

import Octokit from '@octokit/rest';

interface PaginationParams {
  page?: number;

  // camelcase
  perPage?: number;
}

interface GitHubPaginationParams {
  page?: number;

  // underscored
  per_page?: number;
}

class GitHubClient {
  private client: Octokit;

  constructor() {
    this.client = new Octokit();
  }

  getPullRequests(options: PaginationParams) {
    // lost typings of "options" with spread operator (no typescript error)
    return this.client.pulls.list({ owner: 'octokit', repo: 'hello-world', state: 'open', ...options });

    // this works (typescript error)
    // return this.client.pulls.list({ owner: 'octokit', repo: 'hello-world', state: 'open', page: options.page, per_page: options.per_page });

    // this works
    // return this.client.pulls.list({ owner: 'octokit', repo: 'hello-world', state: 'open', page: options.page, per_page: options.perPage });
  }
}

class GitHubService {
  private ghClient: GitHubClient;

  constructor() {
    this.ghClient = new GitHubClient();
  }

  async getPullRequests(options: GitHubPaginationParams) {
    return this.ghClient.getPullRequests(options);
  }
}

我希望打字稿会引发错误,因为GitHubService的options接口与GitHubClient界面中的options不同。

1 个答案:

答案 0 :(得分:0)

您的所有字段(在两个接口中)都是可选的-这意味着即使是空对象也会实现这些接口。标记了必填字段后,预期的行为就会起作用。

当前,您有下一个:

interface PaginationParams {
  page?: number;

  // camelcase
  perPage?: number;
}

interface GitHubPaginationParams {
  page?: number;

  // underscored
  per_page?: number;
}

// cause none of the fields is required
var x:PaginationParams = {};
var y:GitHubPaginationParams = x;

如果您删除?附近的page-该字段将兼容类型。如果您为per_page / perPage删除了它-您将得到预期的错误,或者必须同时提供两个属性