通过使用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
不同。
答案 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
删除了它-您将得到预期的错误,或者必须同时提供两个属性