gpt4 book ai didi

typescript - 为类的方法声明一个附加成员

转载 作者:搜寻专家 更新时间:2023-10-30 20:36:05 25 4
gpt4 key购买 nike

我用 typescript 装饰器装饰了一个方法,向该方法添加了一个成员:

export class MyClass {
@AddMyMember()
public myMethod(param1:string) {
// ...
}
}

这样我就可以这样使用它了:

const myClassInstance = new MyClass();
myClassInstance.myMethod.myMember(); // error of course here, as myMember has not been declared yet...

但我找不到有效声明 myMember 的方法:

export declare interface MyClass {
// Something great here maybe?....
}

最佳答案

合并问题

无法声明一个类的不同类型的成员,声明合并只能添加成员而不能改变现有成员的类型。

我们可以做的是使用交集类型。如果交集类型的两个成员名称相同但类型不同,则交集上的成员将是两个原始类型的交集。

class _MyClass {
public constructor (t: string) {

}
public myMethod(param1:string) {
}

static staticF(){}
}

type ReplaceInstanceType<T extends new(...a: any[])=> any, TNew> = {
new (... a: (T extends new (...p: infer P) => unknown ? P: [])) : TNew
} & Pick<T, keyof T>

export type MyClass = _MyClass & {
myMethod: {
myMember(): void
}
}


export const MyClass: ReplaceInstanceType<typeof _MyClass, MyClass> = _MyClass as any;

let a = new MyClass("") // can new up
a.myMethod("") // can call myMethod
a.myMethod.myMember(); // can call myMember
MyClass.staticF

装饰器问题

问题的第二部分是装饰器不能改变它所应用的成员的类型(这是设计使然)。您可以改用 HOC 来创建类,并传入成员名称列表(使用 keyof 进行编译检查)以添加额外的成员:

type ReplaceInstanceType<T extends new(...a: any[])=> any, TNew> = {
new (... a: (T extends new (...p: infer P) => unknown ? P: [])) : TNew
} & Pick<T, keyof T>

function addMemebers<T extends new(...a: any[])=> any, K extends keyof InstanceType<T>>(members: K[], cls: T) : ReplaceInstanceType<T, InstanceType<T> & Record<K, {myMember(): void}>>{
return null as any; // replace with implementation
}
export const MyClass = addMemebers(["myMethod"], class {
public constructor (t: string) {

}
public myMethod(param1:string) {
}

static staticF(){}
})


let a = new MyClass("") // can new up
a.myMethod("") // can call myMethod
a.myMethod.myMember(); // can call myMember
MyClass.staticF

关于typescript - 为类的方法声明一个附加成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53173462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com