Наследование типов, где типы данных в IntelliSense являются любыми вместо ожидаемого числа

У меня есть крошечная реализация кода в Typescript, где у меня есть класс, реализующий интерфейс или расширяющий класс.

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) { } но я не понимаю, почему я должен это делать.

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

1 ответ

Решение

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

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

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

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

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

Аргумент функции также любой в вашем коде без явной подписи

исправлять

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

Другие вопросы по тегам