派生的typescript类类型不被接受为它自己的基类型

时间:2014-01-24 20:39:34

标签: typescript

我有一些应该可以运行的代码,但我现在意识不到,因为类型的构造函数签名是不同的。

示例:

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”。如果需要鸭子打字,那么答案就是“不”。 ;)

2 个答案:

答案 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条件,您必须满足两个条件:

  1. 拥有一个doSomething的函数typeof A并返回一个数字
  2. 拥有一个'newable'函数,它接收两个字符串并返回A
  3. 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(); }
        }
    }