В чем разница между следующим кодом:

changeName(): ng.IPromise<any>;

А также

changeName: () => ng.IPromise<any>;

Я понимаю, что один тип возврата, но я запутался в первом.

Вот тело функции:

changeName = (): ng.IPromise<any> => {
        var self = this;
        self.chnAction = "PREFERENCES.CHANGE_NAME.SUBMITTING_BUTTON_TEXT";
        self.chnErrorMessage = null;
        return self.uss.changeName(
            self.chnNewFirstName,
            self.chnNewLastName)
            .then(
            (response: ng.IHttpPromiseCallbackArg<any>): any => {
                self.chnAction = "PREFERENCES.CHANGE_NAME.SUBMITTED_BUTTON_TEXT";
                self.chnNewFirstName = '';
                self.chnNewLastName = '';
                self.chnErrorMessage = null;
                self.logout();
                return this.$state.go('home.auth', { content: 'change_name_success' });
            },
            (error: ng.IHttpPromiseCallbackArg<any>): ng.IPromise<any> => {
                if (error.status === 500) {
                    self.chnErrorMessage = 'AUTH_SERVICE.UNABLE_TO_CONTACT_SERVER';
                } else {
                    var errors: string[] = [];
                    Object.keys(error.data.modelState).forEach((key) => {
                        errors.push.apply(errors, error.data.modelState[key]);
                    });
                    self.chnErrorMessage = errors[0];
                    self.chnErrorMessages = errors;
                    self.chnAction = "PREFERENCES.CHANGE_NAME.SUBMIT_BUTTON_TEXT";
                }
                return this.$q.reject(error);
            });
    };
8
user2678324 16 Дек 2015 в 13:52

3 ответа

В чем разница между следующим кодом

Поскольку вы не добавили больше кода, чтобы увидеть, что на самом деле настроено. Как я вижу, у вас есть две строки кода:

changeName(): ng.IPromise<any>;

Согласно этому коду можно понять, что он возвращает обещание типа any, которое может быть чем угодно, object, string, array, number и т. Д.

Таким образом, можно сказать, что changeName() вернет значение ng.IPromise типа <any>.


В то время как другая строка кода:

changeName: () => ng.IPromise<any>;

Говорит, что эта функция вернет значение ng.IPromise вещи <any>.

1
Jai 16 Дек 2015 в 11:29

В интерфейсе нет разницы. Вот интерфейс, который использует обе нотации (давайте для ясности будем использовать string в качестве возвращаемого типа):

interface MyInterface {
    foo(): string; // preferred
    bar: () => string;
}

Здесь foo - это функция с типом возврата string. И тип bar также является функцией с типом возврата string. Первая запись обычно чище. Следующий объект соответствует интерфейсу:

let x: MyInterface = {
    foo: () => "",
    bar: () => ""
}

В классе одна нотация добавляет функцию к прототипу, а другая добавляет ее в качестве свойства нового экземпляра (this.myFunc = ...). Это имеет тот же эффект, что и в JavaScript (и вам почти никогда не нужно добавлять функцию / метод в качестве свойства экземпляра).

class MyClass {
    bar(): string { return ""; } // prototype, preferred
    foo = () => ""; // instance property
}

Как мы видим ниже, класс соответствует нашему исходному интерфейсу, хотя я поменял местами foo и bar. Поэтому интерфейс не навязывает детали реализации того, как будет установлен метод.

let y: MyInterface = new MyClass();

Обратите внимание, что класс не является специальным типом - это фактически интерфейс плюс реализация. Таким образом, вы можете использовать MyClass так же, как и любой другой тип (определенный как интерфейс или класс):

let z: MyClass = {
    foo: () => "",
    bar: () => ""
}

Что касается типов (это то, что определяет интерфейс), то нет никакой разницы, хотя при использовании в классе нотации приводят к различным реализациям.

2
mk. 16 Дек 2015 в 15:09

Было бы лучше показать весь пример кода. Надеюсь, следующий пример объяснит ваш вопрос:

class MyClass {

    changeName(): number {
        return 5;
    }

    changeName2 = ():number => {
        return 5;
    }
}

Переносит в:

var MyClass = (function () {
    function MyClass() {
        this.changeName2 = function () {
            return 5;
        };
    }
    MyClass.prototype.changeName = function () {
        return 5;
    };
    return MyClass;
})();

[Детская площадка]

Существует подробное объяснение различий между этими двумя определениями в: Объявление метода объекта JavaScript в функции конструктора и в прототипе

2
Community 23 Май 2017 в 12:00