0

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

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

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

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

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

4

1 回答 1

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;

如果您删除?near page- 类型将与该字段兼容。如果您为per_page/删除它perPage- 您要么得到预期的错误,要么您必须提供这两个属性

于 2019-07-18T10:07:14.007 回答