从另一种类型中删除一种类型的属性
Remove properties of a type from another type
这个问题与
类似,但有点不同
我想创建一个接受类型的函数,returns 一个不包含 Array 类型或其他复杂(嵌套)对象属性的新类型。
我假设条件类型是处理此问题的最佳(唯一?)方式?如何实现?
您可以使用条件类型(选择键)和 Pick
创建一个仅保留基本类型(不包括数组和其他对象)的条件类型
type PrimitiveKeys<T> = {
[P in keyof T]: Exclude<T[P], undefined> extends object ? never : P
}[keyof T];
type OnlyPrimitives<T> = Pick<T, PrimitiveKeys<T>>
interface Foo {
n: number;
s: string;
arr: number[];
complex: {
n: number;
s: string;
}
}
let d : OnlyPrimitives<Foo> // will be { n: number, s: string }
实际的功能实现应该很简单,只是迭代对象属性并排除object
function onlyPrimitives<T>(obj: T) : OnlyPrimitives<T>{
let result: any = {};
for (let prop in obj) {
if (typeof obj[prop] !== 'object' && typeof obj[prop] !== 'function') {
result[prop] = obj[prop]
}
}
return result;
}
let foo = onlyPrimitives({ n: 10, s: "", arr: [] }) ;
编辑 添加了对可选字段的正确处理。
这个问题与
我想创建一个接受类型的函数,returns 一个不包含 Array 类型或其他复杂(嵌套)对象属性的新类型。
我假设条件类型是处理此问题的最佳(唯一?)方式?如何实现?
您可以使用条件类型(选择键)和 Pick
type PrimitiveKeys<T> = {
[P in keyof T]: Exclude<T[P], undefined> extends object ? never : P
}[keyof T];
type OnlyPrimitives<T> = Pick<T, PrimitiveKeys<T>>
interface Foo {
n: number;
s: string;
arr: number[];
complex: {
n: number;
s: string;
}
}
let d : OnlyPrimitives<Foo> // will be { n: number, s: string }
实际的功能实现应该很简单,只是迭代对象属性并排除object
function onlyPrimitives<T>(obj: T) : OnlyPrimitives<T>{
let result: any = {};
for (let prop in obj) {
if (typeof obj[prop] !== 'object' && typeof obj[prop] !== 'function') {
result[prop] = obj[prop]
}
}
return result;
}
let foo = onlyPrimitives({ n: 10, s: "", arr: [] }) ;
编辑 添加了对可选字段的正确处理。