如何将C#泛型参数Result<T>转换为Angular TypeScript类型
TypeScript 实现 C# 泛型 Result 类型及类型转换问题解决
我需要在 TypeScript 中创建和 C# 类似的泛型参数类型,写代码时遇到了问题。已经完成了 TypeScript 模型的编写,但在执行 Result<class1> modelObj = API_result; 这段代码时卡住了。下面是我的 C# 代码和已写好的 TypeScript 代码,求正确的转换方法。
C# 原代码
public class Result<T> { [JsonProperty("recordsTotal")] public int recordsTotal { get; set; } [JsonProperty("recordsFiltered")] public int recordsFiltered { get; set; } [JsonProperty("data")] public IEnumerable<T> data { get; set; } }
已编写的 TypeScript 代码
export interface Result<T> { recordsTotal: number; recordsFiltered: number; data: T[]; } export interface class1 { lng_id: number; str_name: string; // dtresult:DtResult[class1] }
解决方法
你的 TypeScript 泛型接口定义是正确的,但因为 API 返回的是 JSON 原始对象,无法直接像 C# 那样赋值,需要用 TypeScript 的类型断言或类型守卫来处理:
1. 简单类型断言
适用于你确定 API 返回结构完全符合定义的场景,写法直接:
const modelObj = API_result as Result<class1>;
2. 严格类型校验(类型守卫)
如果需要确保 API 返回数据结构完全匹配定义,避免潜在的结构错误,可以编写类型守卫函数做校验:
// 校验 Result 整体结构的类型守卫 function isResult<T>(obj: unknown, validateItem: (val: unknown) => val is T): obj is Result<T> { if (typeof obj !== 'object' || obj === null) return false; const res = obj as Result<T>; return typeof res.recordsTotal === 'number' && typeof res.recordsFiltered === 'number' && Array.isArray(res.data) && res.data.every(item => validateItem(item)); } // 校验 class1 结构的类型守卫 function isClass1(val: unknown): val is class1 { if (typeof val !== 'object' || val === null) return false; const item = val as class1; return typeof item.lng_id === 'number' && typeof item.str_name === 'string'; } // 使用示例 if (isResult(API_result, isClass1)) { const modelObj = API_result; // 此处自动推断为 Result<class1> 类型 } else { console.error('API 返回数据不符合预期结构'); }
额外建议
TypeScript 中接口名建议遵循大驼峰命名规范(如将 class1 改为 Class1),既符合社区惯例,也能避免和关键字冲突,提升代码可读性。
内容的提问来源于stack exchange,提问作者Dinesh Kumar
相关产品推荐
相关产品推荐

