繁体   English   中英

用嵌套对象打字稿中的另一种类型替换特定类型

[英]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: HumanStringexample.ageexample.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM