2014-01-24 2 views
1

У меня есть немного кода, который должен работать, но я понимаю, что это происходит не потому, что сигнатуры конструктора различаются для типов.Тип производного типа типа не принимается как его собственный базовый тип

Пример:

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 (С)» терпит неудачу, потому что конструкторы не совместимы между типами (потому что одно значение типа должны надлежащим образом представлять два типа в случае «новый» используется) , Я знаю ПРИЧИН, почему, но нет способа (кроме утиного набора) указать конкретный базовый тип? Если нет, это большое ограничение в моих книгах, и там должно быть «baseof», кроме просто «typeof». Если требуется утиная печать, тогда ответ просто «нет». ;)

ответ

1

Да, я знаю, что один из способов решить эту проблему, чтобы поставить "< любой >" перед типом, так

A.doSomething(<any>C); 

или

A.doSomething (< A> < любой > С);

Edit:

Единственное решение, которое я нашел в том, чтобы сделать конструктор параметры же, по крайней мере, первые 2 параметров, что является компромиссом, который работает отлично подходит для моей ситуации ...

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); } 
    } 
} 
0

Таким образом, ошибка имеет смысл. Для того, чтобы квалифицировать в качестве typeof A в вашем примере вы должны удовлетворять двум условиям:

  1. имеют функцию doSomething, которая принимает в typeof A и возвращает номер
  2. имеют «newable» функцию, которая принимает в две строки и возвращает 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(); } 
    } 
} 
+0

Это выглядит хорошо с одним методом, но не хорошо, если кто-то, как ожидается, сохранить интерфейс в синхронизации с большим классом. Дело было в сокращении работы, а не в добавлении к ней. ;) Кроме того, как я уже говорил, использование интерфейсов похоже на утиную печать, о чем я уже говорил. Похоже, что использование является лучшим и самым быстрым решением и может быть легко изменено на сильный тип с использованием «», если потребуется. Решение, которое я выбрал, на самом деле заключалось в том, чтобы конструкторы принимали первый параметр как тот же, а остальные - необязательные для производного типа. –

+0

Просто чтобы добавить, в моем фактическом классе есть много частных переменных, и мне нужно, и интерфейсы (утиная печать) означает, что любой объект, который соответствует ему, может быть передан, но он потерпит неудачу.Решение должно блокироваться с фактическим типом класса, а не с интерфейсом (во всяком случае, в моем случае). –

Смежные вопросы