В чем разница между следующим кодом:
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);
});
};
3 ответа
В чем разница между следующим кодом
Поскольку вы не добавили больше кода, чтобы увидеть, что на самом деле настроено. Как я вижу, у вас есть две строки кода:
changeName(): ng.IPromise<any>;
Согласно этому коду можно понять, что он возвращает обещание типа any, которое может быть чем угодно, object, string, array, number
и т. Д.
Таким образом, можно сказать, что changeName()
вернет значение ng.IPromise
типа <any>
.
В то время как другая строка кода:
changeName: () => ng.IPromise<any>;
Говорит, что эта функция вернет значение ng.IPromise
вещи <any>
.
В интерфейсе нет разницы. Вот интерфейс, который использует обе нотации (давайте для ясности будем использовать 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: () => ""
}
Что касается типов (это то, что определяет интерфейс), то нет никакой разницы, хотя при использовании в классе нотации приводят к различным реализациям.
Было бы лучше показать весь пример кода. Надеюсь, следующий пример объяснит ваш вопрос:
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 в функции конструктора и в прототипе
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.