Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Обсуждений тред (https://javascript.ru/forum/offtopic/47364-obsuzhdenijj-tred.html)

nerv_ 27.10.2015 15:42

Цитата:

Сообщение от trikadin
ты сравнил интерфейс и имплементацию О_о

1. когда в js появятся интерфейсы, тогда и поговорим :) Сейчас их нет)
2. кроме того интерфейс - это описатель (насколько я понимаю), а у тебя уже реализация в твоем "интерфейсе" подмешена. Т.е. это не интерфейс, а базовый класс.

Цитата:

Сообщение от trikadin
Используй class properties из es7, и будет сразу отлично видно, какие свойства у класса есть. Советую в связке с flow -- webstorm его хорошо держит, это удобнее, чем jsdoc.

я всерьез подумываю о том, чтобы перейти на typescript

trikadin 27.10.2015 16:50

Цитата:

Сообщение от nerv_
1. когда в js появятся интерфейсы, тогда и поговорим Сейчас их нет)
2. кроме того интерфейс - это описатель (насколько я понимаю), а у тебя уже реализация в твоем "интерфейсе" подмешена. Т.е. это не интерфейс, а базовый класс.

Ну да, ты прав. Но в любом случае, это класс, не предназначенный для инстанциации, только для наследования. Какие плюсы вижу я: я использую this.constructor, а не Point (т. е. при наследовании всё будет правильно), можно создать много потомков Base, у которых будет единая логика, поведение легко перегружается и расширяется.

Цитата:

Сообщение от nerv_
я всерьез подумываю о том, чтобы перейти на typescript

Он крутой, но стоит подождать 2.0, к сожалению. А пока можно юзать Flow для базовой аннотации:

class Base {
  constructor() {
    Object.assign(this, this.constructor.castConstructorData(...arguments));
  }

  clone() :Base {
    return new this.constructor(this);
  }

  static castConstructorData() {};
}

class Point extends Base {
  x: number;
  y: number;

  constructor(
    pointOrX: ?(number | {x: number, y: number} | Point) = 0,
    y: ?number = 0
  ) {
    super(...arguments);
  }

  static castConstructorData(
    pointOrX: ?(number | {x: number, y: number} | Point) = 0,
    y: ?number = 0
  ) : {x: number, y: number} {
    if (typeof pointOrX === 'number') {
      return {x: pointOrX, y};
    }

    if (typeof pointOrX === 'object') {
      return {x: pointOrX.x, y: pointOrX.y};
    }

    throw new TypeError(`Invalid arguments for Point`);
  }
}


console.log(new Point());
console.log(new Point(1, 2));
console.log(new Point({x: 1, y: 2}));
console.log(new Point(new Point(1, 2)));
console.log(new Point(1, 2).clone());

kobezzza 27.10.2015 19:24

Цитата:

Он крутой, но стоит подождать 2.0, к сожалению. А пока можно юзать Flow для базовой аннотации:
Кстати скоро должен докатится до релиза 1.7 (поддержка асинков и генераторов).

ТайпСкрипт очень крутой (ну очень). Но ему пока реально не хватает ES6/7 фичей, хотя они ща реально сделали рывок в этом плане + пока очень раздражает невозможность описать this в анотации типа и отсутствие partial классов (причём в JS они есть). Поэтому я тоже жду 2.0.

trikadin 27.10.2015 20:03

Цитата:

Сообщение от kobezzza
и отсутствие partial классов (причём в JS они есть).

Это ты про мердж в прототип объекта, у которого методы заданы через расширенный литеральный синтаксис?

FINoM 27.10.2015 21:33

Цитата:

Сообщение от nerv_
FINoM, можно больше кода? Напиши для функции foo() пример.

Лучше живой пример.
https://github.com/matreshkajs/matre...jsdoc#L87-L146

Первая вариация: http://ru.matreshka.io/#!Matreshka-on
Вторая вариация: http://ru.matreshka.io/#!Matreshka-on(2)

Как видишь, я просто определил метод дважды с разными параметрами. Для первого (основного) @variation не использовал.

(не на правах рекламы :))

nerv_ 28.10.2015 00:12

Цитата:

Сообщение от trikadin
Но в любом случае, это класс, не предназначенный для инстанциации, только для наследования.

т.е. абстрактный класс. Тады PointAbstract

Цитата:

Сообщение от trikadin
я использую this.constructor, а не Point (т. е. при наследовании всё будет правильно)

это да
Цитата:

Сообщение от trikadin
можно создать много потомков Base, у которых будет единая логика, поведение легко перегружается и расширяется.

и это тоже :)


---

FINoM, спасибо :) Карму не плюсует.

---

Цитата:

Сообщение от kobezzza
Поэтому я тоже жду 2.0.

уже известна дата релиза?

bes 28.10.2015 01:23

http://javascript.ru/forum/287999-post1062.html
Цитата:

Сообщение от cyber
20.12.2013, 11:01

Цитата:

Сообщение от cyber (Сообщение 287999)
kobezzza, я всетаки прописал grunt, танцы с бубном и битой помогли)

сейчас это решение описано в документации http://gruntjs.com/getting-started
в 2013 году возможно его там не было, хотя на 2ip.ru показал дату создания домена Creation Date: 19-apr-2012, но может быть и не было

в общем, там при глобальной установке дополнительно к grunt-у нужно ещё поставить grunt-cli
Цитата:

npm install -g grunt-cli
при установке которого на винду создастся файлик %appdata%\npm\grunt.cmd с незатейливым содержимым, а так как каталог %appdata%\npm после установки node.js оказывается в path, а .cmd по умолчанию в pathext, то становится возможным запуск по короткому имени - grunt

натолкнулся на этот пост сегодня (читай вчера), когда пытался понять почему глобальный grunt --help не выводит справку, а локальный выводит,
оказалось, что в файле %appdata%\npm\node_modules\grunt-cli\bin\grunt, который используется при "глобальном вызове", это просто не предусмотрено в отличие от node_modules\grunt\lib\grunt.js, который используется при "локальном вызове"
логика не совсем понятна, но уже можно спокойно идти спать :)

trikadin 28.10.2015 01:46

Цитата:

Сообщение от nerv_
т.е. абстрактный класс. Тады PointAbstract

Интерфейсом скорее по привычке обзываю.

А именовать как хочешь можно, хех.

bes 28.10.2015 21:22

Цитата:

Сообщение от bes
оказалось, что в файле %appdata%\npm\node_modules\grunt-cli\bin\grunt, который используется при "глобальном вызове", это просто не предусмотрено в отличие от node_modules\grunt\lib\grunt.js, который используется при "локальном вызове"

точнее будет сказать так: файл %appdata%\npm\node_modules\grunt-cli\bin\grunt используется всегда при вызове из консоли, но при вызове глобально установленного grunt (когда не находит локально установленного) до использования node_modules\grunt\lib\grunt.js в последней строчке просто не доходит (gruntpath is null)
// Everything looks good. Require local grunt and run it.
require(gruntpath).cli();

cyber 05.11.2015 15:24

как в es6 сделать что то такое?
расширить класс объектом
var obj = {
  hello: "world"
  
};

class UseGuide extends obj {

  constructor(height, width) {
    super();
    
  }
}


Часовой пояс GMT +3, время: 15:31.