在ts中使用Object.defineProperty( ) / Object.defineProperties( ) 时,会发现其中的this类型为any,导致种种不快。例如下图,理想情况下this的类型应该为 Room

如何为this上类型?其实查看`Object.defineProperty`的类型声明可以看到有一个ThisType<any>类型,这是ts专门预留的一个标识符。

所以,我们只需要让我们传入的属性描述对象具有 ThisType<你想要的this类型> 类型就可以了

可以简单的在尾部使用as,也可以将PropertyDescriptor单独声明为带this类型的变量然后传给Object.defineProperties

此外,你也可以为函数提供this参数。不用担心会导致参数错位,ts在编译成js后会去掉this参数。

ts
编译后的js

思考:在类型声明文件中我们可以看到,微软为this默认指定了any类型而不是T 。不幸的是官方并没有给出这样做的理由。在 https://github.com/microsoft/TypeScript/issues/49162 中我们可以看到部分讨论。

很惭愧的是,笔者由于尚未接触过复杂情况,想不到什么好例子。。


I am a noob