创建含指定类型属性的TypeScript接口报错,求非泛型解决方案
解决方案:用字符串字面量替代接口作为type值
问题根源在于:TypeScript的接口是编译时类型,编译后会被完全移除,无法作为运行时的值使用。你直接把接口a赋值给type属性,相当于在运行时引用一个不存在的变量,所以报错。
下面是不依赖泛型的实现方案,核心是用字符串字面量类型作为type的合法取值,同时建立字面量与对应接口的类型关联,兼顾运行时可用性和编译时类型检查:
完整代码实现
// 定义运行时可用的类型标识(字符串字面量类型) export type TypeIdentifier = 'a' | 'b' | 'c' | 'd' | 'e'; // 建立标识与对应接口的类型映射(仅用于编译时类型检查) type TypeMap = { 'a': a; 'b': b; 'c': c; 'd': d; 'e': e; }; // 原有接口定义保持不变 export interface a { aProp1: boolean; aProp2: string; } export interface b { bProp1: number; bProp2: string; } export interface c { cProp1: boolean; cProp2: string; } export interface d { dProp1: boolean; dProp2: string; dProp3: string; } export interface e { eProp1: boolean; } // 修改Basic接口:type使用运行时可用的字符串字面量类型 interface Basic { id: string; type: TypeIdentifier; userId: string; organizationId: string; timestamp: string; data: string; // 对应type关联接口的序列化字符串 } // 正确创建实例:type赋值为字符串标识 const example: Basic = { id: "", userId: "", organizationId: "", timestamp: "", data: JSON.stringify({ aProp1: true, aProp2: "test" }), type: 'a' };
可选:编译时检查序列化数据(无泛版)
如果希望在编译时确保data的原始数据符合对应接口的结构,可以不用泛型,直接手动关联类型:
// 手动创建对应类型的序列化数据 const aData: a = { aProp1: true, aProp2: "test" }; const exampleWithTypeCheck: Basic = { id: "", userId: "", organizationId: "", timestamp: "", data: JSON.stringify(aData), type: 'a' };
这种方式通过提前声明变量的类型,确保序列化前的数据符合接口约束,避免手动写JSON时出错。
内容的提问来源于stack exchange,提问作者A M
相关产品推荐
相关产品推荐

