实现思路
- 使用递归的方式处理嵌套的对象和数组。
- 对于对象类型,通过映射类型遍历每个属性。如果属性值是字符串类型,将其转换为大写形式;如果是对象类型,递归应用相同的转换;如果是数组类型,对数组中的每个元素递归应用转换。
- 使用模板字面量类型来将字符串转换为大写形式。
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']
};