# 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];
};

# 知识点

  1. 基础类型和字面量类型的判别、关系
  2. 遍历对象,递归处理嵌套逻辑
Last Updated: 2023/5/16 06:00:28