我对 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
, 所以你不能确定她没有 house
或 spells
属性(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/