带有嵌套模式的类型化REST API
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带有嵌套模式的类型化REST API相关的知识,希望对你有一定的参考价值。
我正在尝试使用Typescript编写完整的类型代码,该代码向现有REST API发出请求。此API允许在请求中任意嵌套模型。为简单起见,假设我们只有两个模型User
和Address
以及一个假的getUser
。这就是我得到的:
interface User {
id: string;
name: string;
age: number;
address: Address;
}
interface Address {
country: string;
city: string;
}
type UserSelector = {
id: null;
name: null;
age: null;
address: Partial<AddressSelector>;
};
type AddressSelector = {
country: null;
city: null;
};
function getUser<K extends keyof UserSelector>(_fields: Pick<UserSelector, K>): Pick<User, K> {
// return a mock object, will get from DB in real code
return {
id: "1",
name: "Jean Seberg",
age: 30,
address: { country: "FR", city: "Paris" },
} as Pick<User, K>;
}
const user = getUser({
//unknownField: null, // SHOULD TYPE ERROR, IT DOES
id: null,
age: null,
address: { country: null },
});
console.log(user.id, user.age, user.address.country);
//console.log(user.name); // SHOULD TYPE ERROR, IT DOES
console.log(user.address.city); // SHOULD TYPE ERROR, IT DOES NOT
正如您所看到的,这不符合预期,user.address.city
应该给出编译类型错误,因为密钥city
不在地址选择器中。很明显为什么它不起作用,但我不知道如何以通用方式编写它以支持任何嵌套级别(具有关系的硬编码类型似乎不是一种选择)。
这可能在Typescript(任何版本)中。怎么样?
答案
类型检查是正确的。
type UserSelector = {
id: null;
name: null;
age: null;
address: Partial<AddressSelector>;
};
type AddressSelector = {
country: null;
city: null;
};
address
的属性UserSelector
是Partial
,这意味着AddressSelector
的所有属性是可选的,所以如果没有显示city
就可以了。
根据您的需要,您应该删除Partial
并具体使用AddressSelector ['country']和AddressSelector ['city']的类型。
以上是关于带有嵌套模式的类型化REST API的主要内容,如果未能解决你的问题,请参考以下文章
如何从 REST API 定义多个或嵌套 json 数据的数组类型