如何移除对象属性并转换为TypeScript子集类型(规避ESLint报错)
解决方案:移除额外属性并避免ESLint未使用变量报错
针对你遇到的问题,这里提供几种无需禁用ESLint规则、也不用delete操作的实现方式,按实用性排序:
1. 通用属性选取工具函数(最优解)
写一个可复用的pick函数,只提取目标类型需要的属性,同时保留TypeScript的类型检查:
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 } // 通用pick函数 function pick<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> { return keys.reduce((result, key) => { result[key] = obj[key]; return result; }, {} as Pick<T, K>); } // 提取需要的属性 const alex: PersonWithoutId = pick(person, ['name', 'age', 'address']);
这种方式的优势:
- 完全符合类型安全,属性名写错会直接触发TypeScript报错
- 函数可复用在任何需要提取属性的场景
- 不会产生未使用变量,自然避免ESLint报错
2. 直接构造目标对象(适合属性较少的场景)
如果目标类型的属性不多,直接手动构造新对象是最直观的方式:
const alex: PersonWithoutId = { name: person.name, age: person.age, address: person.address };
优点是简单直接,无需额外工具函数;缺点是属性较多时会产生重复代码,维护成本高。
3. 过滤对象键值对(需类型断言)
利用Object.entries和Object.fromEntries过滤掉多余属性,不过需要配合类型断言:
const alex: PersonWithoutId = Object.fromEntries( Object.entries(person).filter(([key]) => key !== 'id') ) as PersonWithoutId;
这种方式无需手动列举属性,但缺点是丢失了部分类型安全——如果属性名拼写错误(比如把id写成Id),TypeScript不会提前报错,只能在运行时发现问题。
内容的提问来源于stack exchange,提问作者zlZimon
相关产品推荐
相关产品推荐

