TypeScript类型定义:如何用omit数组忽略属性类型校验?
工具函数
copyKnownProperties的TypeScript类型优化需求 我创建了copyKnownProperties工具函数,作用是仅当属性同时存在于两个对象/类时,将属性从源对象复制到目标对象(示例中从B复制到A),JavaScript逻辑运行正常。目前已实现TypeScript对类型不匹配属性的复制警告(示例中仅foo属性类型一致),但希望通过传入omit数组忽略指定属性,使其不触发类型不匹配报错,不知道怎么写对应的TypeScript类型定义。
实现方案
通过条件类型结合联合类型排除,实现支持忽略指定属性的类型约束:
完整类型定义与函数实现
// 提取两个对象中类型兼容的共同属性 type CommonCompatibleProps<T, U> = { [K in keyof T & keyof U]: T[K] extends U[K] ? K : never; }[keyof T & keyof U]; // 从兼容属性中排除需要忽略的属性 type FilteredProps<T, U, O extends PropertyKey> = Exclude<CommonCompatibleProps<T, U>, O>; function copyKnownProperties<T, U, O extends PropertyKey>( target: T, source: Pick<U, FilteredProps<T, U, O> | O>, omit?: O[] ): void { const sourceKeys = Object.keys(source) as Array<keyof U>; for (const key of sourceKeys) { // 跳过忽略的属性 if (omit?.includes(key as O)) continue; // 仅复制目标对象存在的属性 if (key in target) { (target as Record<keyof T, unknown>)[key] = source[key]; } } }
代码说明
CommonCompatibleProps<T, U>:遍历两个对象的共同属性,只保留类型兼容的属性名FilteredProps<T, U, O>:从兼容属性集中移除omit数组指定的属性- 源对象
source的类型被约束为Pick<U, ...>,允许传入包含忽略属性的对象,但仅对非忽略的兼容属性做类型校验
使用示例
class A { foo: string = ''; bar: number = 0; } class B { foo: string = ''; bar: string = ''; baz: boolean = false; } const a = new A(); const b = new B(); // 正常执行:忽略bar属性,不触发类型报错 copyKnownProperties(a, b, ['bar']); // 触发报错:未忽略bar,A.bar与B.bar类型不匹配 copyKnownProperties(a, b);
内容的提问来源于stack exchange,提问作者uPaymeiFixit
相关产品推荐
相关产品推荐

