by TypeFox / community (open source) Neovim, Emacs, Helix, VS Code (через volar/tsserver)
LSP-обёртка вокруг TypeScript compiler API (tsserver). Стандартный LSP-сервер для TypeScript и JavaScript — используется во всех редакторах кроме VS Code (у него свой tsserver). Возможности: - Полный TypeScript type checking и inference - Автодополнение: переменные, методы, импорты - Auto-import: автоматическое добавление import - Goto definition / find references - Rename refactoring через весь проект - Code actions: fix imports, extract function, convert - JSDoc поддержка - Поддержка JSX/TSX
# npm:
npm install -g typescript typescript-language-server
# Neovim (nvim-lspconfig):
require('lspconfig').ts_ls.setup{}
# Emacs (lsp-mode):
(add-hook 'typescript-mode-hook #'lsp)
# Helix (languages.toml):
[[language]]
name = "typescript"
language-servers = ["typescript-language-server"]
# Проверить установку:
typescript-language-server --version
Проект/пакет TypeScript включает компонент tsserver, который предоставляет пользовательский API для сбора различной информации о проекте TypeScript/JavaScript. Команда VSCode создала проект под названием Typescript Language Features (и встроила его как внутреннее расширение в VSCode), который обеспечивает интеллектуальный анализ кода для ваших проектов JavaScript и TypeScript, используя этот API tsserver. Поскольку это расширение не использует стандартизированный Протокол языкового сервера для общения с редактором, другие редакторы, реализующие LSP, не могут напрямую его использовать. Здесь на помощь приходит проект TypeScript Language Server, целью которого является предоставление тонкой оболочки LSP поверх кодовой базы этого расширения для пользы всех остальных редакторов, реализующих протокол LSP.
Изначально проект был основан на концепциях и идеях из https://github.com/prabirshrestha/typescript-language-server и поддерживался компанией TypeFox. В настоящее время проект поддерживается сообществом участников, таких как вы.
Этот проект не связан напрямую с Microsoft и не используется в их редакторе VSCode. Если у вас есть проблема с функциональностью VSCode, сообщите о ней в их репозитории.
В настоящее время Microsoft работает над TypeScript 7, написанным нативно на языке Go, который будет включать реализацию LSP и, как ожидается, заменит этот проект.
npm install -g typescript-language-server typescript
typescript-language-server --stdio
Использование: typescript-language-server [опции]
Опции:
-V, --version вывести номер версии
--stdio использовать stdio (обязательная опция)
--log-level <уровень-журнала> Число, указывающее уровень журнала (4 = журнал, 3 = инфо, 2 = предупреждение, 1 = ошибка). По умолчанию `3`.
-h, --help вывести информацию об использовании
См. документацию по конфигурации.
Сервер объявляет о поддержке следующих типов действий кода:
source.fixAll.ts - несмотря на название, исправляет несколько конкретных проблем: недостижимый код, await в не-асинхронных функциях, неправильно реализованный интерфейсsource.removeUnused.ts - удаляет объявленные, но неиспользуемые переменныеsource.addMissingImports.ts - добавляет импорты для используемых, но не импортированных символовsource.removeUnusedImports.ts - удаляет неиспользуемые импортыsource.sortImports.ts - сортирует импортыsource.organizeImports.ts - упорядочивает и удаляет неиспользуемые импортыЭто позволяет редакторам, поддерживающим запуск действий кода при сохранении, автоматически запускать исправления, связанные с этими типами.
Эти действия кода, если они применимы к текущему коду, также должны отображаться в списке "Действий источника", если редактор предоставляет такую возможность.
Пользователь может включить это с помощью параметра, подобного следующему (может отличаться в зависимости от редактора):
"codeActionsOnSave": {
"source.organizeImports.ts": true,
// или просто
"source.organizeImports": true,
}
workspace/executeCommand)См. спецификацию LSP.
В большинстве случаев вы будете выполнять команды с аргументами, полученными из другого запроса, например, textDocument/codeAction. Существуют некоторые варианты использования для их ручного вызова.
lsp относится к типам протокола языкового сервера, tsp относится к типам протокола сервера TypeScript.
Запрос:
{
command: '_typescript.goToSourceDefinition'
arguments: [
lsp.DocumentUri, // строковый URI документа
lsp.Position, // позиция строки и символа (с нуля)
]
}
Ответ:
lsp.Location[] | null
(Эта команда поддерживается начиная с TypeScript 4.7.)
Запрос:
{
command: '_typescript.applyRefactoring'
arguments: [
tsp.GetEditsForRefactorRequestArgs,
]
}
Ответ:
void
Запрос:
{
command: '_typescript.organizeImports'
arguments: [
string, // путь к файлу
// Опциональные параметры:
{
// @deprecated - используйте "mode". Поддерживается начиная с TypeScript 4.4+.
skipDestructiveCodeActions?: boolean
// 'All' - упорядочивает импорты, включая деструктивные действия (удаление неиспользуемых импортов)
// 'SortAndCombine' - Не выполняет деструктивных действий.
// 'RemoveUnused' - Только удаляет неиспользуемые импорты.
mode?: 'All' | 'SortAndCombine' | 'RemoveUnused'
},
]
}
Ответ:
void
Запрос:
{
command: '_typescript.applyRenameFile'
arguments: [
{ sourceUri: string; targetUri: string; },
]
}
Ответ:
void
Запрос:
{
command: 'typescript.tsserverRequest'
arguments: [
string, // команда
any, // аргументы команды в формате, ожидаемом командой
ExecuteInfo, // объект конфигурации, используемый для запроса tsserver (см. ниже)
]
}
Ответ:
any
Объект ExecuteInfo определен следующим образом:
type ExecuteInfo = {
executionTarget?: number; // 0 - семантический сервер, 1 - синтаксический сервер; по умолчанию: 0
expectsResult?: boolean; // по умолчанию: true
isAsync?: boolean; // по умолчанию: false
lowPriority?: boolean; // по умолчанию: true
};
Запрос:
{
command: '_typescript.configurePlugin'
arguments: [pluginName: string, configuration: any]
}
Ответ:
void
textDocument/codeLens)Кодовые линзы могут быть включены с помощью параметров конфигурации рабочей области implementationsCodeLens и referencesCodeLens.
Кодовые линзы предоставляют количество ссылок и/или реализаций для символов в документе. Для клиентов, которые это поддерживают, также можно нажимать на них для перехода к соответствующим местам в проекте. Обратите внимание, что нажатие на них запускает команду editor.action.showReferences, которую клиент должен поддерживать явно. Многие клиенты поддерживают это по умолчанию, но некоторые — нет. Пример команды будет выглядеть так:
command: {
title: '1 reference',
command: 'editor.action.showReferences',
arguments: [
'file://project/foo.ts', // URI
{ line: 1, character: 1 }, // Позиция
[ // Список объектов Location.
{
uri: 'file://project/bar.ts',
range: {
start: {
line: 7,
character: 24,
},
end: {
line: 7,
character: 28,
},
},
},
],
],
}
textDocument/inlayHint)Для того чтобы запрос возвращал какие-либо результаты, некоторые или все следующие параметры должны быть включены через preferences:
export interface InlayHintsOptions extends UserPreferences {
includeInlayParameterNameHints: 'none' | 'literals' | 'all';
includeInlayParameterNameHintsWhenArgumentMatchesName: boolean;
includeInlayFunctionParameterTypeHints: boolean;
includeInlayVariableTypeHints: boolean;
includeInlayVariableTypeHintsWhenTypeMatchesName: boolean;
includeInlayPropertyDeclarationTypeHints: boolean;
includeInlayFunctionLikeReturnTypeHints: boolean;
includeInlayEnumMemberValueHints: boolean;
}
Сразу после инициализации сервер отправляет пользовательское уведомление $/typescriptVersion, которое содержит информацию о версии TypeScript, используемой сервером. Редактор затем может отобразить эту информацию в пользовательском интерфейсе.
Параметры уведомления $/typescriptVersion включают два свойства:
version - семантическая версия (например, 4.8.4)source - строка, указывающая, является ли используемая версия TypeScript версией из локального рабочего пространства (workspace), явно указанной через настройку initializationOptions.tsserver.path (user-setting) или встроенной в сервер (bundled)Сервер запрашивает у клиента (при поддержке клиентом возможности workspace/configuration) параметры конфигурации, специфичные для файла (tabSize и insertSpaces), которые необходимы tsserver для корректного форматирования изменений в файле, например, при использовании «Упорядочить импорты» или выполнении других изменений файла. Эти параметры должны предоставляться клиентом/редактором динамически, поскольку их значения могут различаться для каждого файла. По этой причине сервер отправляет запрос workspace/configuration с scopeUri, равным URI файла, и section, равным formattingOptions. Ожидается, что клиент вернет конфигурацию, включающую следующие свойства:
{
"tabSize": number
"insertSpaces": boolean
}
pnpm build
Сборка и пересборка при изменениях.
pnpm dev
pnpm test - запустить все тесты в режиме отслеживания для разработкиpnpm test:commit - запустить все тесты один разПо умолчанию в консоль выводятся только журналы уровня warning и выше. Вы можете переопределить уровень CONSOLE_LOG_LEVEL в package.json на log, info, warning или error для вывода журналов других уровней.
Проект использует Github-действие https://github.com/google-github-actions/release-please-action для автоматического выпуска новой версии при слиянии PR для выпуска.