Наследование типов, где типы данных в 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
если вы хотите, чтобы компилятор ловил эти случаи для вас