通过使用Octokit软件包,我想列出所有拉取请求(client.pulls.list
(。
我有一个GitHubClient(Octokit的包装器(和GitHubService(GitHubClient的包装器(。GitHubService 有一个选项参数,使用具有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
不同。
您的所有字段(在两个接口中(都是可选的 - 这意味着即使是空对象也实现了这些接口。一旦您标记字段为必填字段,预期行为就会起作用。
目前你有下一个:
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
- 则会收到预期的错误,或者必须同时提供这两个属性