как добавить два числа в машинописи с помощью интерфейсов - PullRequest
0 голосов
/ 08 июня 2018

здесь я пытаюсь добавить два числа, используя машинописные интерфейсы и концепцию функций стрелок.когда я запускаю скомпилированный код js, он вызывает метод add () и отображает NaN.

ниже приведен код ts: - var add = (Num) => console.log (Num.num1+ Num.num2);

interface Num {
num1: number;
num2: number;
}

this.add(1,2);

ниже указан код js: -

var add = function (Num) { return console.log(Num.num1 + Num.num2); };
this.add(1, 2);

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Вы определили функцию add(), которая принимает параметр типа Num, но вы фактически передаете ему два числа, а не Num.Поэтому просто измените ваш вызов на

add({num1: 1, num2: 2});

, который является объектом с нужным вам реквизитом.Надеюсь, это поможет

0 голосов
/ 08 июня 2018

Основная причина: нет аннотации типа

Хотя другие ответы решают симптом, я не верю, что они решили основную проблему в вашем коде, которая находится здесь:

var add = function (Num) { return console.log(Num.num1 + Num.num2); };

Параметр здесь называется Num и не имеет типа .Я полагаю, что вы хотели, чтобы это было:

//                   name: type
const add = function (num: Num) { return console.log(num.num1 + num.num2); };

Вызов Add

Ваш код не находится в определенном контексте, поэтому давайте на секунду отбросим this и посмотрим на вызовadd функция:

// ERROR: Expected 1 arguments, but got 2.
// const add: (num: Num) => void
add(1, 2);

TypeScript теперь помогает вам увидеть ошибку в вашем вызове.Решение вызова на add без решения вашей основной причины устранило симптом, но не основную проблему.

Теперь вы можете обновить свой вызов, добавив:

add({ num1: 1, num2: 2 });

И это будетработа - как и все будущие звонки;потому что ваша функция add теперь имеет информацию о типе.

Demo

Перетащите следующее в файл TypeScript или на площадку TypeScript, чтобы увидеть это в действии:

interface Num {
    num1: number;
    num2: number;
}

const add = function (num: Num) { return console.log(num.num1 + num.num2); };

add(1, 2);

add({ num1: 1, num2: 2 });

add (1, 2)

Если вы хотите иметь метод add, который разрешает подпись add(1, 2), вам нужно изменить подпись ... сама полностью аннотированная функция может быть описана как:

const add = function (a: number, b: number): number {
    return a + b
};

Если вы хотите увидеть, как интерфейс выглядит для этого, он будет ниже:

interface Adder {
    (num1: number, num2: number): number;
}

const add: Adder = function (a, b) {
    return a + b;
};

Super Add

Если вы хотите, чтобы ваша функция addобрабатывать больше чисел, вы можете использовать параметр rest ... как это:

const add = function (...numbers: number[]) {
    if (!numbers || !numbers.length) {
        return 0;
    }    

    return numbers
        .reduce(function (acc, val) {
            return acc + val;
        });
};

console.log(add());

console.log(add(1, 2));

console.log(add(1, 2, 3, 4));

Это будет обрабатывать любое количество аргументов.

0 голосов
/ 08 июня 2018

this.add({ num1: 1, num2: 2 }); - это точка.

В вашем коде вы передаете два параметра (1 и 2), функция ожидает только один (Num).Таким образом, вы должны передать значения как объект Num.

...