Как оптимизировать описания типов в этом калькуляторе? - PullRequest
0 голосов
/ 12 сентября 2018

Я новый человек в TypeScript, скажите мне, как оптимизировать типы данных в этом коде, что я бы не писал все время number. Я читал, что это можно сделать, через generics подскажите, как правильно и кратко описать этот код

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:number) {
        return this._res = num + num;
    }

    subtract(num:number) {
        return this._res = num - num;
    }

    multiply(num:number) {
        return this._res = num * num;
    }

    divide(num:number) {
        return this._res = num / num;
    }

    print():void {
        console.log(`Currently value: ${this._res}`);
    }
}
let calc1 = new Calculator();
calc1.add(1);calc1.add(1);
calc1.print();

1 Ответ

0 голосов
/ 12 сентября 2018

Поскольку вы уже записали определения типов для каждой функции в интерфейсе, вы можете пропустить повторное добавление типов к ним при их определении.

Это будет идентично типу:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...