2016-07-12 1 views
0

У меня крошечная реализация кода в TypScript, где у меня есть класс, реализующий интерфейс или расширяющий класс.Наследование на машинописных машинах, где типы данных в IntelliSense - это любое вместо ожидаемого числа

interface ITest { 
    run(id: number): void 
} 

abstract class Test implements ITest { 

    abstract run(id); 
} 

class TestExtension extends Test 
{ 
    constructor() { 
     super(); 
    } 

    public run(id) { } 
} 

class TestImplementation implements ITest { 
    constructor() { 

    } 

    public run(id) { } 
} 

Как показывает неправильный Intellisense, где я ожидал идентификатор по типу «числа»:

(method) TestExtension.run(id: any): void 
(method) TestImplementation.run(id: any): void 

Я могу, конечно, реализация присваивателя будет public(id: number) { }, но я не понимаю, почему я должен сделай это.

Может кто-нибудь просветить меня, пожалуйста?

ответ

0

Ваше понимание implements ITest немного верное. Реализация интерфейса TypeScript не похожа на другие langauges, это просто статический статический компилятор, который должен быть совместим с классом интерфейса с определением интерфейса.

Так как следующее правильно:

let foo: number; 
let bar; // inferred any 
foo = bar; 

следующее тоже правильно

interface IFoo { 
    foo: number 
} 
class Foo implements IFoo { 
    foo; // Inferred any 
} 

Функция аргумент также любые в коде без явных подписей

Fix

Будьте явным: public run(id) { } - public run(id: number) { } И, возможно, скомпилируйте с noImplicitAny, если вы хотите, чтобы компилятор поймал эти случаи для вас

+0

Я вижу, но вам не кажется странным, что мой абстрактный класс и абстрактный метод, который не имеет какой-либо реализации, все еще есть в расширяющийся класс? Мне нужно немного отличить от Typcript – Lostfields

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