我有一些应该可以运行的代码,但我现在意识不到,因为类型的构造函数签名是不同的。
示例:
module test {
export class A {
constructor(a: string, b: string) { }
static doSomething(a: typeof A): number { return 0; }
}
}
module test {
export class B extends A {
constructor() { super("0", "1"); }
}
export class C extends B {
static n = A.doSomething(C);
x: number;
constructor(c: C) { super(); }
}
}
'A.doSomething(C)'失败,因为构造函数在类型之间不兼容(因为在使用'new'的情况下,一个类型值必须正确表示两种类型)。我知道原因为什么,但是没有办法(除了鸭子打字)指定所需的特定基本类型?如果没有,这是我书中的一个很大的限制,除了“typeof”之外,还需要一个“baseof”。如果需要鸭子打字,那么答案就是“不”。 ;)
答案 0 :(得分:1)
是的,我知道解决问题的一种方法是放“< any>”在类型之前,所以
A.doSomething(<any>C);
或
A.doSomething(小于a取代;&LT;任何&℃);
编辑:
我找到的唯一解决方案是至少在前两个参数中使构造函数参数相同,这是一种适用于我的情况的妥协......
module test {
export class A {
constructor(a: string, b: string) { }
static doSomething(a: typeof A): number { return 0; }
}
}
module test {
export class B extends A {
constructor(a: string, b: string) { super(a, b); }
}
export class C extends B {
static n = A.doSomething(C);
x: number;
constructor(a: string, b: string, c?: C) { super(a, b); }
}
}
答案 1 :(得分:0)
所以错误是有道理的。要在您的示例中符合typeof A
条件,您必须满足两个条件:
doSomething
的函数typeof A
并返回一个数字A
typeof C
只是与第二个点上的那个接口不匹配。问题不是表达你想要做的事情。
我要做的是创建一个界面,该界面代表您需要输入doSomething
才能完成工作的一组功能。没有明确创建typeof A
来实现该接口并不重要。如果它匹配所要求的所有内容,您可以将其传入。
以下是您重新设计的示例:
// This is the important bit here
interface DoSomethingParam {
doSomething(a: DoSomethingParam): number;
}
module test {
export class A {
constructor(a: string, b: string) { }
static doSomething(a: DoSomethingParam): number { return 0; }
}
}
module test {
export class B extends A {
constructor() { super("0", "1"); }
}
export class C extends B {
static n = A.doSomething(C);
x: number;
constructor(c: C) { super(); }
}
}