Cha*_*IER 8 strong-typing typescript typescript-typings
我用一个typescript装饰器装饰了一个方法,在方法中添加了一个成员:
export class MyClass {
@AddMyMember()
public myMethod(param1:string) {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
所以我应该能够这样使用它:
const myClassInstance = new MyClass();
myClassInstance.myMethod.myMember(); // error of course here, as myMember has not been declared yet...
Run Code Online (Sandbox Code Playgroud)
但我找不到有效声明myMember的方法:
export declare interface MyClass {
// Something great here maybe?....
}
Run Code Online (Sandbox Code Playgroud)
没有办法声明具有不同类型的类的成员,声明合并只能添加成员而不更改现有成员的类型.
我们可以做的是使用交叉类型.如果交集类型的两个成员具有相同的名称和不同的类型,则交集的成员将是两个原始类型的交集.
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
Run Code Online (Sandbox Code Playgroud)
问题的第二部分是装饰器不能改变它所应用的成员的类型(这是设计).您可以使用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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
165 次 |
| 最近记录: |