Comments 27
Хорошая подборка для новичков. Хотя местами статья явно устарела. Пример объекта AppError содержит ошибки, при этом Error расширяется не совсем корректно, так же можно избежать использования lodash для такой простой операции как merge:
function AppError(code, data) {
let message = code.replace(/_/g, ' '); // Превращаем user_not_found в "user not found".
Error.call(this, message);
Error.captureStackTrace(this, this.constructor);
this.code = code;
this.message = message;
this.name = this.constructor.name; // Вывод в консоль не должен страдать, так что добавляем имя
this.data = Object.assign({}, data); // Используем data для удобной конвертации в JSON и для избежания конфликта имен свойств.
}
Object.setPrototypeOf(AppError.prototype, Error.prototype); // new AppError('some_code') instanceof Error
Спасибо, исправил!
Я не показываю подробно всего, что можно сделать в кастомной ошибке, это зависит от конкретного проекта, например в своих проектах я обычно добавляю свойство uiShow, которое определяет показывать ли ошибку на клиенте как есть или общее сообщение типа "Server Error", а текст ошибки вычитывается по коду ошибки, а не преобразует сам код в виде читабельной строки.
let a = {a:{a:1}};
let b = Object.assign({}, a);
a.a.a = 2;
console.log(b.a.a === a.a.a); // true
let a = {a:{a:1}};
let b = _.merge({}, a);
a.a.a = 2;
console.log(b.a.a === a.a.a); // false
https://github.com/yegor-sytnyk/contoso-express
>> TypeScript 95.4%
TypeScript !== Javascript
== не рекомендуется к использованию.
Вот из-за того, что вы говорите то, что не думаете и думаете то, что не думаете — вот из за этого у вас все проблемы.
— Кин Дза Дза
Вся суть джаваскрипта в двух коментариях короче.
function greeter(person: string) {
return "Hello, " + person;
}
а судя по этой таблице https://kangax.github.io/compat-table/es6/#node6 нода достаточно хорошо поддерживает новые стандарты JS
да прогоните typescript через tsc, target es6 и получите тот же код только без упоминания типов. Считать typescript самостоятельным языком? Ну ок, наверно такие люди тоже для чего то нужны.
И ответ DenimTornado: если вам не нравится javascript — не пишите на нем. Пишите на Typescript, JScript, Dart, Coffeescript если вам хочется. Но пожалуйста, не называйте эти языки javascript'ом. Это вводит в заблуждение сообщество и убивает веб.
вы удивитесь сколько языков можно скомпилировать в javascript.
Не удивлюсь, я в курсе. Все началось с вот этого:
Строим свой full-stack на JavaScript: Сервер tutorial»
https://github.com/yegor-sytnyk/contoso-express
TypeScript 95.4%
Я считаю что скомпилировав код проекта в js и используя полученный результат МОЖНО утверждать что мы строим стек на javascript. Возражения?
В пределе всё всё равно сводится к маш. кодам. Но люди почему-то не любят их использовать.
Уже 6.6.0 вышел. Обновитесь.
Я не утверждаю, что TypeScript это тоже самое, что JS, но большинство того, что описываю в этой сатье не зависимо от того что конкретно используется.
TS расширение JS, поэтому код на TS должно быть легко читать даже тем, кто с TS не знаком.
Например flow от Facebook, вообще позиционируется как static type checker, а не отдельный язык, хоть и добавляет аннотации типов в JS.
Как я уже писал TS имеет как плюсы так и минусы и каждый сам решает насколько ему это подходит, я планирую добавить альтернативную ветку в Contoso с JS имплементацией.
То есть когда выполнится неравенство typeof str !== 'string' && str instanceof String
console.log(typeof new String());
var str = new String();
console.log(typeof str !== 'string' && str instanceof String);
выведет true.
Так. а что ожидалось? (просто вопрос был "когда выполнится неравенство" — я дал пример того когда оно выполняется)
А, в этом смысле. Я уже на минусы не заморачиваюсь — похоже аудитория вконтакта прочно переехала на хабр. А по поводу объекта — "не представляю ситуации в которых такое определение строки может иметь преимущества перед литеральной записью" — тут дело не в преимуществе, тут дело в том что есть ситуации когда заранее не знаешь входящий тип, вот и приходится перестраховываться (модуль например какой пишешь или привязываешься сам к чьему то модулю и подозреваешь изменения в будущих версиях. В общем бывают ситуации.
Например, знаменитое 0.1 + 0.2 не равняется 0.3 в связи с тем, что в JavaScript нет встроенного десятичного типа.
Может, я чего-то не понимаю в знаменитостях, но еще на первом курсе любого технического вуза рассказывали как сравнивать типы с плавающей точкой?
Loopback
Могу поделится своим негативным опытом. Дело было год назад. Речь о REST API сервере.
Штука в целом прикольная — ты такой накидал конфигурацию, а оно такой быстренько поехало. Ну почти.
Только хвалёный ORM не может делать джойны в БД. Ну и эпизодически выплывали интересные артефакты, связанные с тем, что местному ORM-у, ну скажем так, есть еще куда расти.
Справедливости ради, архитектурно там предусмотрены дырки, куда можно засунуть правильную реализацию джойнов и всего этого database-related добра с учетом специфики конкретной базы, но на тот момент готовых компонент для этого не нашлось.
Ну и в ряде мест оно необъяснимо тормозило. В документации об этом разумеется не писали, но дебаг приводил опять же в ORM.
В результате переписали за месяц на Express + Mongoose. Стало лучше, быстрее, и главное проще и более предсказуемо.
Строим свой full-stack на JavaScript: Сервер