[英]Replace a specific type with another type in a nested object typescript
我想用另一种类型替换特定类型,如下所示:
interface Human {
name: string;
age: number;
isMarried: boolean;
animals: [
{ name: string, age: number},
{ name: string, age: number}
]
}
type HumanString = ReplaceTypes<Human, number, string>
/*
HumanString {
name: string;
age: string;
isMarried: boolean;
animals: [
{ name: string, age: string},
{ name: string, age: string}
]
}
*/
其中具有以下接口ReplaceTypes<OriginalType, OldType, NewType>
Oldtype
应在NewType
的所有嵌套出现中替换
您可以使用如下所示的递归映射类型来做到这一点:
type ReplaceTypes<ObjType extends object, FromType, ToType> = {
[KeyType in keyof ObjType]: ObjType[KeyType] extends object
? ReplaceTypes<ObjType[KeyType], FromType, ToType> // Recurse
: ObjType[KeyType] extends FromType // Not recursing, need to change?
? ToType // Yes, change it
: ObjType[KeyType]; // No, keep original
}
例如,如果你有example: HumanString
, example.age
和example.animals[number].age
都将是string
而不是number
。
它查看每个属性的类型是否扩展对象,如果是,则递归; 否则,它会查看该类型是否扩展了“from”类型,如果是则替换它。
所有这些ObjType[KeyType]
的重复实例都令人厌烦,因此您可以将其分为两部分:
type ReplaceType<Type, FromType, ToType> =
Type extends object
? ReplaceTypes<Type, FromType, ToType>
: Type extends FromType
? ToType
: Type;
type ReplaceTypes<ObjType extends object, FromType, ToType> = {
[KeyType in keyof ObjType]: ReplaceType<ObjType[KeyType], FromType, ToType>;
}
如果您希望能够使用FromType
作为对象来执行此操作,类型,如果您更改顺序,它应该可以工作:
type ReplaceType<Type, FromType, ToType> =
Type extends FromType // FromType?
? ToType // Yes, replace it
: Type extends object // Recurse?
? ReplaceTypes<Type, FromType, ToType> // Yes
: Type; // No, leave it alone
type ReplaceTypes<ObjType extends object, FromType, ToType> = {
[KeyType in keyof ObjType]: ReplaceType<ObjType[KeyType], FromType, ToType>;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.