typescript - TS 在返回的对象中定义动态属性的类型
问题描述
所以我从 API 中获取这种数据。
{
data: {
[dynamicPropertyName]: { // property name changes depending on endpoint
elements: [], // this also dynamically change depending on the endpoint
total: 0
}
}
}
现在我想出了一种方法来解决在数据属性中具有动态属性的问题,尽管我似乎无法将正确的类型传递给elements
属性。
export interface Result<T> {
elements: T[];
total: number;
}
export type SearchResultData< T > = {
[ k in keyof T ]: Result<T>
};
export interface SearchResult<T> {
data: SearchResultData<T>;
}
interface User {
name: string;
}
export interface UsersResult {
users: User[]
}
export type UsersSearchResult = SearchResult<UsersResult>
const a: UsersSearchResult = {
data: {
users: {
elements: [{
/// here it's resolving the UserResult Type instead of User
}],
total: 0
}
}
}
我想避免两次定义 User 类型,例如export type UsersSearchResult = SearchResult<UsersResult, USer>
.
有什么方法可以从T[k]
我传递给的类型中提取类型SearchResult<T>
吗?
就像是
export type SearchResultData< T > = {
[ k in keyof T ]: Result<T[k]> /// ????
};
更新:
原来只是我的愚蠢错误。只是为了其他人遇到同样的问题。这是更新的代码。
export interface Result<T> {
elements: T;
total: number;
}
export type SearchResultData< T > = {
[ k in keyof T ]: Result<T[k]>
};
解决方案
您需要指定elements
将属于同一键的对象。如下所示,我只是将元素设置为表示的键的值k
。
(另外,我在多种类型中上下查找有点困难,所以我创建了一个统一的界面,但它也应该适用于您的代码)。
export interface SearchResult<T> {
data: {
[k in keyof T]: {
elements: T[k];
total: number;
};
};
}
// Example
interface User {
name: string;
}
export interface UsersResult {
users: User[];
}
export type UsersSearchResult = SearchResult<UsersResult>;
const a: UsersSearchResult = {
data: {
users: {
elements: [
{
name: "wwe",
},
{
name: "wwe",
},
],
total: 0,
},
},
};
推荐阅读
- haskell - 带中缀符号的无点样式
- java - 如何将动态模型设置为改造请求?
- c# - 从控制台 C# 连接 Intranet(OnPremise) SharePoint Server 2013
- sql-server - 定长数据文件,在 BULK INSERT 前预览结果
- vb.net - 列表框的粗体/重新着色所选项目(VB.NET)
- gradle - 使用 gradle 从 Nexus 获取 oracle JDBC jar
- ruby-on-rails - 不能使用 rake db:migrate
- jquery - 有两个事件监听器,如果一个被调用,那么另一个不应被调用
- xcode - xcode 9中的Apple Mach-O链接器错误
- android - “Android.Runtime.JavaProxyThrowable'被抛出”在后台长时间恢复时