MST

星途 面试题库

面试题:TypeScript 类型系统中的映射类型与模板字面量类型深度探究

给定一个复杂的对象类型,例如包含多层嵌套对象和数组的类型,使用映射类型和模板字面量类型来生成一个新类型,新类型需要将原对象中所有字符串类型的属性值转换为大写形式,同时保持对象结构不变。请详细描述实现思路,并给出完整的 TypeScript 类型定义代码以及如何使用这个新类型。
41.0万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 使用递归的方式处理嵌套的对象和数组。
  2. 对于对象类型,通过映射类型遍历每个属性。如果属性值是字符串类型,将其转换为大写形式;如果是对象类型,递归应用相同的转换;如果是数组类型,对数组中的每个元素递归应用转换。
  3. 使用模板字面量类型来将字符串转换为大写形式。

TypeScript 类型定义代码

type ToUpperCaseString<S extends string> =
    S extends `${infer First}${infer Rest}`
      ? `${Uppercase<First>}${ToUpperCaseString<Rest>}`
       : S;

type DeepUpperCase<T> =
    T extends string
      ? ToUpperCaseString<T>
      : T extends Array<infer Item>
       ? DeepUpperCase<Item>[]
        : T extends object
         ? {
              [K in keyof T]: DeepUpperCase<T[K]>;
          }
          : T;

使用这个新类型

// 示例复杂对象
const originalObj = {
    name: 'john',
    age: 30,
    address: {
        city: 'new york',
        street: '123 main st'
    },
    hobbies: ['reading', 'writing']
};

// 使用新类型
type NewType = DeepUpperCase<typeof originalObj>;
const newObj: NewType = {
    name: 'JOHN',
    age: 30,
    address: {
        city: 'NEW YORK',
        street: '123 MAIN ST'
    },
    hobbies: ['READING', 'WRITING']
};