能否将TypeScript接口/类型别名转换为字符串字面量类型?
TypeScript中能否将接口/类型别名/原始类型转为字符串字面量类型?
不行,TypeScript的类型系统不支持直接将类型本身转换为对应名称的字符串字面量类型。
原因很直接:TypeScript的类型信息在编译阶段会被完全擦除,类型本身没有任何运行时标识,编译器没办法把Person、number这类类型直接映射成它们的字符串名称。你尝试的${string & Person}写法只是类型层面的拼接语法,根本不会解析出类型的名称,所以只会得到${string & Person}这个无效的类型结果。
针对你第二个示例里的需求——把Values<Person>的结果从number | Name | Pet转换成'number' | 'Name' | 'Pet',可以用以下两种替代方案:
方案一:手动维护类型到字符串的映射
直接通过条件类型手动指定每个类型对应的字符串字面量:
type Name = { firstName: string, lastName: string } type Pet = { dog: number, cat: number, possum: number } type Person = { name: Name pet: Pet age: number } type Values<T> = T[keyof T]; // 手动定义类型与字符串的映射关系 type TypeToString<T> = T extends number ? 'number' : T extends Name ? 'Name' : T extends Pet ? 'Pet' : never; type ValueStrings = TypeToString<Values<Person>>; // 结果为 'number' | 'Name' | 'Pet'
方案二:给自定义类型添加运行时标识字段
如果需要更灵活的方案,可以给自定义接口/类型别名添加一个固定的type字段(作为运行时标识),再通过类型提取这个字段的值,原始类型单独处理:
type Name = { type: 'Name', firstName: string, lastName: string } type Pet = { type: 'Pet', dog: number, cat: number, possum: number } type Person = { name: Name pet: Pet age: number } type Values<T> = T[keyof T]; // 提取自定义类型的type字段,原始类型单独匹配 type TypeToString<T> = T extends { type: infer S } ? S : T extends number ? 'number' : T extends string ? 'string' : T extends boolean ? 'boolean' : never; type ValueStrings = TypeToString<Values<Person>>; // 结果为 'number' | 'Name' | 'Pet'
内容的提问来源于stack exchange,提问作者alveifbklsiu259
相关产品推荐
相关产品推荐

