Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Если вы еще не в курсе: JavaScript победил.
отсутствие intellisense при наборе кода
Динамическая типизация, которая вызывает множество регрессионных ошибок.
Отсутствие модульности.
TypeScript добавляет возможность объявлять модули, классы и интерфейсы. Это позволяет масштабировать разработку сложных JavaScript приложений.
Почему системы реального времени невозможно написать на JS?
Многопоточные приложения пишутся в ноде из коробки
Расскажите, что вы понимаете под «инфраструктура заточена под крупные проекты» и почему инфраструктура JS/Node под них не заточена.Даже начинать этот разговор не хочу, если честно, конец недели, пятница, не хочу. Если есть хороший программист на Си++ рядом, то спросите его, он наверное даже покажет. Лучше будет, если программист занят в каком-то проекте, где работает пара десятков человек.
svay.com/blog/hacking-rfid-with-nodejs/
Рейтинг а-ля IMDB я писал лично (top-books.info)
www.mapjs.org/
media.tojicode.com/q3bsp/
Ещё примеры?
Да, пожалуйста.
var results =
SomeCollection
.Where(c => c.SomeProperty < 10)
.Select(c => new {c.SomeProperty, c.OtherProperty});
float
в метод, который по сигнатуре принимает int
. Чтоб не писать два метода, пишут шаблонный метод. Number
, то хороший редактор нам подскажет, что у этого аргумента можно вызвать метод, например, toPrecision
. Чтобы перемешать коллекцию, достаточно чтобы у нее было свойство length
и оператор доступа по ключу (посмотрите тут реализацию метода _.shuffle)function Foo(x) {
var ret = {};
for (key in x)
ret[key] = x[key];
return ret;
}
/**
* @param {X} x
* @return {Y}
*/
function foo(x) {
var ret = new Y;
for (var key in x)
ret[key] = x[key];
return ret;
}
var a = foo({x:10, y:20});
var b = foo({y:30, z:40});
var source = [
new Foo(...),
new Foo(...),
new Foo(...),
];
var r = source.Where(function(foo) {...});
var f = constructors[prompt('enter constructor name')];
var source = [
new f(...),
new f(...),
new f(...),
];
var r = source.Where(function(foo) {...});
если типы могут быть не любыми … extends BaseType
/**
* @param {BaseType[]} f
*/
function filter (foo) {…}
А что в этом коде предполагается дальше делать с коллекцией r, которая теперь содержит элементы неизвестного типа?
widgets.forEach(function(widget) { widget.render(); });
так и программист, написавший connections.forEach(function(connection) { connection.send(message); });
прекрасно знают, с какой коллекцией они работают. И редактор это тоже знает.Array.prototype.forEach = function forEach( callback, thisArg ) {
var T, k;
if ( this == null ) {
throw new TypeError( "this is null or not defined" );
}
// 1. Let O be the result of calling ToObject passing the |this| value as the argument.
var O = Object(this);
// 2. Let lenValue be the result of calling the Get internal method of O with the argument "length".
// 3. Let len be ToUint32(lenValue).
var len = O.length >>> 0; // Hack to convert O.length to a UInt32
// 4. If IsCallable(callback) is false, throw a TypeError exception.
// See: http://es5.github.com/#x9.11
if ( {}.toString.call(callback) !== "[object Function]" ) {
throw new TypeError( callback + " is not a function" );
}
// 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
if ( thisArg ) {
T = thisArg;
}
// 6. Let k be 0
k = 0;
// 7. Repeat, while k < len
while( k < len ) {
var kValue;
// a. Let Pk be ToString(k).
// This is implicit for LHS operands of the in operator
// b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk.
// This step can be combined with c
// c. If kPresent is true, then
if ( Object.prototype.hasOwnProperty.call(O, k) ) {
// i. Let kValue be the result of calling the Get internal method of O with argument Pk.
kValue = O[ k ];
// ii. Call the Call internal method of callback with T as the this value and
// argument list containing kValue, k, and O.
callback.call( T, kValue, k, O );
}
// d. Increase k by 1.
k++;
}
// 8. return undefined
};
var source = [...];
var r = source.map(function(arg) { return new Foo(...);});
var map = Function.prototype.call.bind(Array.prototype.map);
var source = [...];
var r = map(souce, function(arg) { return new Foo(...);});
<notForHolyWar>
</notForHolyWar>
using Namespace.Module;
, которое транслируется в валидные команды.export module depModule {
export class A {
}
}
define(["require", "exports"], function(require, exports) {
(function (depModule) {
var A = (function () {
function A() { }
return A;
})();
depModule.A = A;
})(exports.depModule || (exports.depModule = {}));
})
TypeScript в действии
При наборе кода в VisualStudio доступна богатая подсказка
function Queue() { };
Queue.prototype.enqueue = function queue_enqueue(...) {...};
var q = new Queue();
Так, в этом коде та версия eclipse, которая стоит у меня, в объекте q почему-то находит метод queue_enqueue вместо enqueue.!function() {
this.foo = ...;
}();
вообще мало кто воспринимает правильно…!function() {
this.foo = ...;
}();
вообще использовать не стоит — вызовет ошибку в strict mode.На нём можно создавать веб-приложения (клиент и сервер), в том числе с оффлайн-режимом работы, десктопные приложения (для Windows 8), приложения для смартфонов и планшетов (PhoneGap), расширения для Microsoft Office, SharePoint и Dynamics.Уточнение в скобках насчёт «для Windows 8» можете отставить в сторону. Я упоминал ужé на Хабрахабре про движок
interface MSStyleCSSProperties{
webkitTransform:any;
}
(Shapes || (Shapes = {}))
Динамическая типизация, которая вызывает множество регрессионных ошибок.
Отсутствие модульности. Нет ни модулей, ни классов, прототипное ООП рвет мозг тем, кто пишет на C++\Java\C#.
Неочевидное поведение во многих местах.
На сегодняшний день это самый кроссплатформенный язык, доступный для любых устройствЧто такое «самый кроссплатформенный», и что значит для любых устройств? Не говоря уже о скорости работы интерпретируемого языка, на множестве устройств, скорей всего, его никогда не будут использовать. Конечно, далее понятно, что речь именно о приложениях, но всё же, примите во внимание…
Почему вам стоит использовать TypeScript