我想要转换特定类型的另一个对象的一个对象,其中第一个对象的属性包含另一个对象的所有属性,但有一些额外的属性.

给出以下示例:

type person = {
    name: string;
    age: number;
    address: string;
    id: number;
}

type personWithoutId = {
    name: string;
    age: number;
    address: string;
}

const person: person = {
    name: 'John',
    age: 30,
    address: '123 Main St',
    id: 1
}

// eslint-disable-next-line @typescript-eslint/no-unused-vars
const { id, ...rest } = person;

const alex: personWithoutId = rest;

这很有效,但是eslint在抱怨,我想摆脱禁用 comments 的规则. 我不能 Select delete%的财产,因为它不是可选的.

那么,做这件事的最佳方式是什么呢?

推荐答案

您可以使用类来实现这一点,因为它们的工作方式类似于类型:

class Person {
  name = ''
}

class PersonWithId extends Person {
  id = ''
  // add here other propeties you want
}

然后,您可以创建对象清理器函数,如下所示:

function clearObject<T>(C: any, o: any, f: any = {} ): T {
  Object.keys( C ).forEach( ( key: any ) => {

      const keyType = typeof C[ key ]
      const Value = o[ key ] ?? C[ key ] 

      if (
        !!Value &&
        keyType === 'object' &&
        Object.keys( Value ).length > 0
      ) {
        // if key is another object
        if ( !Array.isArray( Value ) ) {
          f[ key ] = clearObject( C[ key ], Value )
          return f
        }

        // if key is an array
        Value.forEach( ( itens: any ) => {
          f[ key ] = clearObject( C[ key ], itens, f[ key ] )
          return f
        } )
      }
      
      // assign the value to it's key
      f[ key ] = Value
    } )
    // return the new object cleared and typed
    return f as T
}

此函数将为type类的每个键循环,并从对象中仅获取您的type类中存在的键,然后创建一个新对象并返回类型化的对象. 您可以这样使用它:

const person: PersonWithId = {
  name: 'John',
  id: 1
}

const cleared = clearObject<Person>(new Person(), person)

注意,现在cleared变量来自类型Person,如果您试图从它获取ID,TS将显示一个错误.

这适用于您要基于另一个类型类清除的任何对象,而不会出现任何TS错误

Here's a code sandbox example

Typescript相关问答推荐

为什么当类类型与方法参数类型不兼容时,该函数可以接受类类型

当类型不能undefined时,如何使编译器抛出错误?

如何使用Generics保留构造函数的类型信息?

有没有办法适当缩小类型?

带有联合参数的静态大小数组

忽略和K的定义

接口的额外属性作为同一接口的方法的参数类型'

在NextJS中获得Spotify Oauth,但不工作'

如何使函数接受类型脚本中具有正确类型的链接修饰符数组

创建一个根据布尔参数返回类型的异步函数

是否存在类型联合的替代方案,其中包括仅在某些替代方案中存在的可选属性?

如何在深度嵌套的Reaction路由对象中隐藏父级?

有没有办法防止类型交集绕过联合类型限制?

与toast.error一起react 中的Async TUNK错误消息

创建依赖函数参数的类型

为什么特定的字符串不符合包括该字符串的枚举?

如何扩展RxJS?

重写返回任何

有没有办法在Reaction组件中动态导入打字脚本`type`?

如何键入';v型';