如何定义仅包含类实例属性(不含方法)的TypeScript类型?
提取类实例的非方法属性类型
你需要从类构造函数中推导仅包含**实例属性(不含方法)**的类型,当前写法会把类的方法也纳入类型,导致对象展开时因缺少方法属性报错。以下是可靠的解决方案:
核心思路
通过映射类型的键重映射,过滤掉实例类型中值为函数类型的属性,只保留非方法的属性。
实现代码
class Foobar { foo: number = 0; bar(): void {} } type ClassProperties<C extends new(...args: readonly unknown[]) => unknown> = C extends new(...args: readonly unknown[]) => infer R // 过滤掉值为Function类型的属性键 ? { [K in keyof R as R[K] extends Function ? never : K]: R[K] } : never ; const foobar = new Foobar(); const data: ClassProperties<typeof Foobar> = { ...foobar }; // 无类型错误
边界情况处理
该方案会自动保留类中的getter属性(因为getter的类型是返回值类型,而非函数),这符合对象展开的实际行为:
class TestClass { get computedValue(): string { return 'hello'; } method(): void {} } type TestProps = ClassProperties<typeof TestClass>; // 类型为 { computedValue: string } const instance = new TestClass(); const data: TestProps = { ...instance }; // 实际值为 { computedValue: 'hello' },类型匹配
原代码问题原因
类的实例类型R包含了所有实例成员(包括方法),而对象展开运算符...默认不会复制类的原型方法(原型方法默认不可枚举),导致展开后的对象缺少方法属性,与原类型定义产生冲突。
内容的提问来源于stack exchange,提问作者shau-kote
相关产品推荐
相关产品推荐

