You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定义仅包含类实例属性(不含方法)的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:45:33