# 16259-将字面量类型转换为基本类型
# 题目描述
// 将类型为字面类型(标签类型)的属性,转换为基本类型。
type PersonInfo = {
name: 'Tom';
age: 30;
married: false;
addr: {
home: '123456';
phone: '13111111111';
};
hobbies: ['sing', 'dance'];
};
// 要求结果如下:
type ExpectedResult = {
name: string;
age: number;
married: boolean;
addr: {
home: string;
phone: string;
};
hobbies: [string, string];
};
# 分析
这题是把字面量类型转换为基础类型,在 ts 中,1, '1' 这样的常量就是字面量类型,而 number, string,是基础类型。
所以本题其实就是遍历对象,判断每个属性值是否是字面量类型,如果是,那么就改为对应的基础类型,如果是元组,则转换元组的元素。
而判断基础类型,可以通过 T extends number、T extends string
来进行某一类型的判断。
从用例看,只需要处理三种基本类型即可:number, string, boolean。
而对于元组,可以递归处理。
# 题解
type ToPrimitive<T> = {
[P in keyof T]: T[P] extends string
? string
: T[P] extends number
? number
: T[P] extends boolean
? boolean
: T[P] extends {}
? ToPrimitive<T[P]>
: T[P];
};
# 知识点
- 基础类型和字面量类型的判别、关系
- 遍历对象,递归处理嵌套逻辑