TypeScript中如何实现以当前对象类型为函数参数/返回类型?
你遇到的核心问题是:直接在Object接口上扩展方法时,TypeScript会默认将方法中的this类型绑定到Object本身,而非调用该方法的具体子类型(比如CSSStyleDeclaration),导致Partial<this>被解析为Partial<Object>,无法识别子类型独有的属性(如fontSize)。
TypeScript完全支持实现这类“参数/返回值类型跟随调用对象类型动态变化”的函数,以下是两种可行的正确写法:
方法1:泛型约束捕获调用对象类型
在.d.ts文件中,将add定义为泛型方法,通过T extends this让泛型T自动捕获调用时的实际对象类型:
interface Object { add<T extends this>(object: Partial<T>): T; }
JavaScript侧的实现无需修改:
Object.prototype.add = function(object) { Object.assign(this, object); }
此时调用document.body.style.add({ fontSize: "12px" })时,TypeScript会自动将T推断为CSSStyleDeclaration,参数类型变为Partial<CSSStyleDeclaration>,可正确识别fontSize属性,不会再抛出错误。
方法2:显式指定this参数类型
利用TypeScript的this参数语法,直接将方法的this类型与泛型T绑定:
interface Object { add<T>(this: T, object: Partial<T>): T; }
这种写法更直观地声明了方法的this必须为T类型,同时参数和返回值也与T关联,效果和方法1完全一致,同样能让TypeScript正确推断调用对象的具体类型。
两种写法的核心都是让TypeScript在方法调用时动态捕获调用对象的实际类型,而非固定使用方法所属接口(Object)的类型。泛型约束或this参数的作用,就是将方法的类型与调用上下文类型绑定,从而实现“参数/返回值类型跟随调用对象类型变化”的需求。
内容的提问来源于stack exchange,提问作者Nick

