typescript - 如何从类型中省略属性?

标签 typescript types

我对 Typescript 中的 Omit 类型有疑问,所以我知道 Omit 类型与 Pick 相反并且是这样构建的:

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>

但是我不知道如何构造一个Omit 类型。我有一个接口(interface) Student看起来像这样:

interface Student { 
name: string, 
surname: string, 
age: number, 
email: string 
}

我需要一个函数,该函数将具有某些给定属性的学生作为输入并输出省略的学生。该函数应如下所示:

let omit_student = <K extends keyof Student>(student: Student, ...props: K[] ): Omit<Student, K> => null!

但我不知道如何动态地从 Student 中省略给定的属性以及函数主体中应该发生什么。

像这样调用函数:omit_student(student1, "name", "age") 应该输出以下类型:

{ 
surname: string, 
email: string 
}

最佳答案

TypeScript 中的对象类型不是 exact 是一个常见的混淆来源. Student 类型的值已知name , surname , age , 和 email适当类型的属性,但只有这些属性是未知的。这允许您 extend通过向它们添加已知属性来类型:

interface Student { 
    name: string, 
    surname: string, 
    age: number, 
    email: string 
}

interface HogwartsStudent extends Student {
    house: string,
    spells: string[]
}

在上面,一个HogwartsStudent是一种特殊类型的 Student .如果我给你一个Student ,你不知道她不是 HogwartsStudent , 所以你不能确定她没有 housespells属性(property)。

Omit<T, K>类型别名产生 T父类(super class)型 .即 T延伸Omit<T, K> .每个类型的值 T也是 Omit<T, K> 类型的值.所有你用Omit<T, K>“省略”的东西| K 中具有键的属性的已知存在和类型.


您要求的不仅是从类型中删除已知键,而且是从生成的对象中删除实际属性。这需要在运行时以与在 JavaScript 中完全相同的方式发生:

function omit_student<K extends Array<keyof Student>>(
  student: Student, ...props: K): Omit<Student, K[number]> {
    const newStudent: Omit<Student, K[number]> = Object.assign({}, student);
    for (let prop of props) {
        delete (newStudent as any)[prop];
    }
    return newStudent;
}

请注意,我使用了 rest tuple type对于 K参数,但您也可以按自己的方式进行。

希望对您有所帮助。祝你好运!

关于typescript - 如何从类型中省略属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55704071/

相关文章:

javascript - 如何在 Typescript 中描述具有泛型值的索引类型?

typescript - 在Typescript中,如何导入json并通过key动态查找?

haskell - 我如何从 haskell 中的函数返回多个值?

objective-c - 参数是 KindOfClass : [NSNumber class] - sane way to check this?

c# - C# 中的 OR-ing 字节给出 int

javascript - 如何更改 typescript 中的CSS样式?

javascript - 如何使用类型脚本在 angular2 中对格式进行编号?

javascript - _co.open 不是函数 :run method based on condition

java - Java中如何在运行时生成泛型类?

c++ - 在C++中传递函数类型的参数是什么意思?