После долгих исследований выясняется, что языковая служба TypeScript предоставляется через рабочий прокси-объект.Это может быть связано с тем, что служба находится в другом потоке, и в нее отправляются сообщения, поэтому необходимо использовать обещания.
Чтобы упростить задачу, я просмотрел открытые функции возвращаемого объекта и создал это определение;надеюсь, это кому-нибудь поможет:
namespace ts {
export interface IMonacoTypeScriptServiceProxy {
_getModel(uri: string): Promise<{ _eol: string, _lineStarts: any, _Lines: string[], length: number, _uri: monaco.Uri, _versionId: number }>;
getCompilationSettings(): Promise<CompilerOptions>;
getCompilerOptionsDiagnostics(): Promise<Diagnostic[]>;
getCompletionEntryDetails(uri: string, position: number, name: string, formatOptions: FormatCodeOptions | FormatCodeSettings | undefined, source: string | undefined, preferences: UserPreferences | undefined): Promise<CompletionEntryDetails | undefined>;
getCompletionsAtPosition(uri: string, position: number, options: GetCompletionsAtPositionOptions | undefined): Promise<WithMetadata<CompletionInfo> | undefined>;
getCurrentDirectory(): Promise<string>;
getDefaultLibFileName(options: CompilerOptions): Promise<string>;
getDefinitionAtPosition(uri: string, position: number): Promise<ReadonlyArray<DefinitionInfo> | undefined>;
getEmitOutput(uri: string, emitOnlyDtsFiles?: boolean): Promise<EmitOutput>;
getFormattingEditsAfterKeystroke(uri: string, position: number, key: string, options: FormatCodeOptions | FormatCodeSettings): Promise<TextChange[]>;
getFormattingEditsForDocument(uri: string, options: FormatCodeOptions | FormatCodeSettings): Promise<TextChange[]>;
getFormattingEditsForRange(uri: string, start: number, end: number, options: FormatCodeOptions | FormatCodeSettings): Promise<TextChange[]>;
getNavigationBarItems(uri: string): Promise<NavigationBarItem[]>;
getOccurrencesAtPosition(uri: string, position: number): Promise<ReadonlyArray<ReferenceEntry> | undefined>;
getQuickInfoAtPosition(uri: string, position: number): Promise<QuickInfo | undefined>;
getReferencesAtPosition(uri: string, position: number): Promise<ReferenceEntry[] | undefined>;
getScriptFileNames(): Promise<string[]>;
getScriptKind(uri: string): Promise<ScriptKind>;
getScriptSnapshot(uri: string): Promise<IScriptSnapshot | undefined>;
getScriptVersion(uri: string): Promise<string>;
/** The first time this is called, it will return global diagnostics (no location). */
getSemanticDiagnostics(uri: string): Promise<Diagnostic[]>;
getSignatureHelpItems(uri: string, position: number, options: SignatureHelpItemsOptions | undefined): Promise<SignatureHelpItems | undefined>;
getSyntacticDiagnostics(uri: string): Promise<DiagnosticWithLocation[]>;
isDefaultLibFileName(uri: string): Promise<boolean>;
}
}
Используется так:
var editor = monaco.editor.create(...etc...);
var tsProxy: ts.IMonacoTypeScriptServiceProxy;
monaco.languages.typescript.getTypeScriptWorker()
.then(function(worker: (v: monaco.Uri) => Promise<ts.IMonacoTypeScriptServiceProxy>) {
worker(editor.getModel().uri)
.then(function(proxy) {
tsProxy = proxy;
});
});
Теперь прокси-функция называется getEmitOutput(uri: string, emitOnlyDtsFiles?: boolean)
.uri
- это имя файла, которое monaco.Uri
преобразуется в строку (model
в терминах Монако - это один файл в редакторе), поэтому:
tsProxy.getEmitOutput(editor.getModel().uri.toString())
.then((r) => { console.log(r.outputFiles[0].text); });
Возвращает перенесенный JavaScriptИ все остальные файлы (если есть)!Пожалуйста.:)