Поскольку вы уже записали определения типов для каждой функции в интерфейсе, вы можете пропустить повторное добавление типов к ним при их определении.
Это будет идентично типу:
interface ICalculator {
add(num: number): number;
subtract(num: number): number;
multiply(num: number): number;
divide(num: number): number;
print(): void;
}
class Calculator implements ICalculator {
protected _res: number;
add(num) {
return this._res = num + num;
}
subtract(num) {
return this._res = num - num;
}
multiply(num) {
return this._res = num * num;
}
divide(num) {
return this._res = num / num;
}
print() {
console.log(`Currently value: ${this._res}`);
}
}
Вы также можете определить тип функции для более рефакторинга:
type NumberOperation = (num: number) => number
interface ICalculator {
add: NumberOperation
subtract: NumberOperation
multiply: NumberOperation
divide: NumberOperation
print(): void;
}
Edit:
Тициан Черникова-Драгомир верна Class method parameter are never inferred, they will be implicitly typed to any
Если вы не хотите вводить каждую функцию внутри класса, вы можете использовать интерфейс при объявлении экземпляра класса:
const calc: ICalculator = new Calculator()
calc.add('string') // type error