将一个或多个 trait 对象的属性描述符复制到 ctor.prototype,实现运行时扩展。
所有 trait 类型通过 UnionToIntersection 合并为交叉类型后作为 ThisType
绑定,因此每个 trait 内部的 this 都能感知:
class MyClass {
name = 'test'
}
type GreetTrait = { greet(): string }
implTraits(MyClass, {
greet() {
return `hello, ${this.name}` // this.name ← MyClass ✓
},
})
interface MyClass extends GreetTrait {}
type GreetTrait = { greet(): string }
type DisplayTrait = { display(): string }
implTraits(MyClass,
{
greet() {
return `hi, ${this.display()}` // this.display ← DisplayTrait ✓
},
},
{
display() {
return this.name // this.name ← MyClass ✓
},
},
)
interface MyClass extends GreetTrait, DisplayTrait {}
工厂函数内部定义对象时,编译器无法自动感知宿主类型,需通过显式 this
参数或泛型约束来补充:
type PrefixTrait = { prefixed(): string }
function createPrefixTrait<Host extends { name: string }>(prefix: string) {
return {
prefixed(this: Host) {
return `${prefix}::${this.name}` // this.name ← Host 约束 ✓
},
}
}
implTraits(MyClass, createPrefixTrait<MyClass>('app'))
interface MyClass extends PrefixTrait {}
constructor 属性,避免破坏原型链defineProperty 而非赋值,能正确处理 getter / setterObject.getOwnPropertySymbols),支持 [Symbol.iterator] 等 Well-Known Symbolinterface MyClass extends TraitA, TraitB {} 声明合并noUnsafeDeclarationMerging,
interface 声明前 suppress noUnusedVariables:// biome-ignore lint/suspicious/noUnsafeDeclarationMerging: implTraits guarantees runtime implementation
class MyClass { ... }
implTraits(MyClass, { ... })
// biome-ignore lint/correctness/noUnusedVariables: trait type extension via implTraits
interface MyClass extends MyTrait {}
目标类构造器
一个或多个 trait 实现对象
biome-ignore-all assist/source/organizeImports: 手动维护导出排序