Объясните важность и необходимость tsd (or typings as new npm module)

Всем добрый день!

Хотелось бы поинтересоваться у тех кто активно использует TS несколько топиков.

  1. Зачем нужен tsd или его новый коллега typings (Так как “npm WARN deprecated tsd@0.6.5: TSD is deprecated in favor of Typings (https://github.com/typings/typings) - see https://github.com/DefinitelyTyped/tsd/issues/269 for more information”)

  2. Важно ли его иметь, если не планируешь в ближайшее время использовать все фичи или даже их малую часть TS, что правда в будущем наоборот планируешь.

P.S. Используем angular2 + TS stack (под сборкой minimalist) на работе, интересно узнать зачем этот (tsd) компонент.

P.S.S. Изменили minimalist на нормальный и самый лучший на сегодняшний день сборщик Seed2

Система типов в ts построена таким образом, что любой тип, о котором не знает ts будет расценен как ошибка. И при этом ts позиционируется как язык, который легко работает с сущствующим js кодом, включая, например, js библиотеки. В js обычным делом считается объявить глобальную переменную в одном файле и использовать ее в другом.

Ты пишешь ts код, который использует, например jQuery. С точки зрения ts функция jQuery не объявлена.

ts имеет возможность подключать *.d.ts файлы, в которых описываются интерфейсы (но не реализация) объявленных в js коде объектов и функций. Чтобы ts понял что существует jQuery и какие методы и какие типы возвращаемых значений у методов jQuery, необходимо в ts файл подключить файл *.d.ts с определениями jQuery.

К твоему вопросу. tsd нужен для того чтобы из командной строки подгружать файлы определений.

Мы используем tsd на проекте для подгрузки файлов определения jQuery, jasmine и полифилов методов и классов, о которых не знает стандартная библиотека ts.

А как они у вас хранятся? Можешь показать структуру проекта и как запускаете проект интересует шульп таска (или инное), что отвечает конктретно за TS компилинг и раннинг?

Нет, NDA. Но могу подсказать как организовать код на примере другого проекта.

Я бы посоветовал webpack + ts-loader, а все typings класть в корень проекта. В конфигурации tsconfig.json положить ссылку на корневой файл тайпингов, это позволит не заморачиваться с явным прописыванием ссылки на корневой tsd.d.ts в каждом файле, где не хватает тайпингов.

{
  "compilerOptions": {
    "target": "es5",
    "sourceMap": true,
    "module": "commonjs"
  },
  "files": [
    "./typings/tsd.d.ts"
  ]
}

Добро, спасибо! А почему используете deprecated tsd? И можешь показать, как этот проект запускается? В вебпак конфиге внутри ts лоадера лежит путь к tsconfig? Или как-то иначе?

Я узнал о деприкейте проекта вот только от тебя. Когда принимал решение о том что и как использовать, tsd был вполне наплаву. Деприкейта не боюсь, потому что перейти на альтернативу не составит труда, и существующие тайпинги вполне справляются со своей задачей. Возможны проблемы после обновления версии языка.

На этом проекте, скриншот которого я кинул, я обкатываю разные концепции организации. В частности пробовал делать такой сетап: тайпскриптовые модули, с возможностью использования less. Запускается webpack-dev-server через npm-скрипт.

Нет. tsconfig.json - это абстракция, которая независима от типа сборщика который используется на проекте, поэтому лоадер может (и должен) подхватывать tsconfig.json файл по умолчанию.

Мой вебпак конфиг выглядит так:

'use strict'

var path = require('path')
var ExtractTextPlugin = require('extract-text-webpack-plugin')

module.exports = {
	entry: './src/app.ts',
	devtool: 'source-map',
	resolve: {
		extensions: ['', '.webpack.js', '.js', '.ts', '.tsx', '.less']
	},
	module: {
		loaders: [
			{
				test: /\.tsx?$/,
				loader: 'ts-loader'
			},
			{
				test: /\.less$/,
				loader: ExtractTextPlugin.extract("style-loader", "css-loader!less-loader")
			}
		]
	},
	output: {
		path: path.resolve(__dirname, 'build'),
		filename: 'script.js'
	},
	devServer: {
		contentBase: path.resolve(__dirname, 'build')
	},
	plugins: [new ExtractTextPlugin('style.css', {
		allChunks: true
	})]
}

Большая часть конфигурации нужна для того чтобы можно было инклюдить стили из ts модулей, но в итоге получать 2 файла: js и css.

Вот, что значит веб-пак и нормальная сборка, точнее быть самодельная, файл tsconfig сам подтягивается. У нас с ним какая-то странная манипуляция происходит. То есть перед компайлом ts мы вызываем метод createProject у модуля typescript, где указываем путь к этому конфигу. У нас используется gulp.

А вот less лоадер в твоем примере выглядит некрасиво :) хотя я подазреваю это как раз из-за:

в итоге получать 2 файла

Спасибо, Дима, твой ответ очень помог, как всегда!