如何在具有外部类型定义的摩纳哥中使用 addExtraLib
How to use addExtraLib in Monaco with an external type definition
我可以看到如何在 Monaco 中使用 addExtraLib
添加环境声明文件。不清楚的是如何将此函数与外部声明文件一起使用,以便编辑器中的 Typescript 代码可以执行以下操作:
import * as External from "external"
External.foo();
在摩纳哥设置方面,这似乎不起作用:
// compiler options
monaco.languages.typescript.typescriptDefaults.setCompilerOptions({
target: monaco.languages.typescript.ScriptTarget.ES2016,
allowNonTsExtensions: true,
moduleResolution: monaco.languages.typescript.ModuleResolutionKind.NodeJs,
module: monaco.languages.typescript.ModuleKind.CommonJS,
noEmit: true,
noLib: true,
typeRoots: ["node_modules/@types"]
});
// extra libraries
monaco.languages.typescript.typescriptDefaults.addExtraLib(
'export declare function foo():string;', 'node_modules/@types/external/index.d.ts');
monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({
noSemanticValidation: false,
noSyntaxValidation: false
经过一番尝试,我找到了解决办法。基本上,文件必须使用 createModel
和显式文件 URL 加载。如果您这样做,则 node_module/@types
的相对文件路径有效。这是我可以在操场上使用的工作解决方案:
// compiler options
monaco.languages.typescript.typescriptDefaults.setCompilerOptions({
target: monaco.languages.typescript.ScriptTarget.ES2016,
allowNonTsExtensions: true,
moduleResolution: monaco.languages.typescript.ModuleResolutionKind.NodeJs,
module: monaco.languages.typescript.ModuleKind.CommonJS,
noEmit: true,
typeRoots: ["node_modules/@types"]
});
// extra libraries
monaco.languages.typescript.typescriptDefaults.addExtraLib(
`export declare function next() : string`,
'node_modules/@types/external/index.d.ts');
monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({
noSemanticValidation: false,
noSyntaxValidation: false
})
var jsCode = `import * as x from "external"
const tt : string = x.dnext();`;
monaco.editor.create(document.getElementById("container"), {
model: monaco.editor.createModel(jsCode,"typescript",new monaco.Uri("file:///main.tsx")),
});
Joe 的回答对我不起作用,通过在外部类型定义文件路径前加上 file:///
来解决
这是 playground 的更新示例:
monaco.languages.typescript.typescriptDefaults.addExtraLib(
'export declare function add(a: number, b: number): number',
'file:///node_modules/@types/math/index.d.ts'
);
const model = monaco.editor.createModel(
`import {add} from 'math';\nconst x = add(3, 5);\n`,
'typescript',
monaco.Uri.parse('file:///main.tsx')
);
monaco.editor.create(document.getElementById('container'), {model});
没有必要提供编译器选项和诊断选项。
截至 2021 年 4 月 (monaco-editor@0.23.0
),如果没有基于 monaco-editor#2295, monaco-editor#1839, and 的一些额外细节,我无法使之前的任何一个解决方案正常工作。我的用例需要从几个现有的 NPM 包(不仅仅是文件的任意路径)提供类型定义,这可能影响了解决方案。总而言之,我需要:
- 将每个包中的 所有 个文件捆绑到一个文件中。 TypeScript doesn't make this easy, and so instead I used dts-bundle-generator,但存在其他解决方案。
- 使用 raw-loader 或其他纯文本加载替代方法为每个包导入
.d.ts
内容。
- 使用每个模块的源代码调用
addExtraLib
,向源代码添加显式 declare module 'module-name'
。
完整示例如下:
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
import source1 from '!!raw-loader!./types/package-one.d.ts';
import source2 from '!!raw-loader!./types/package-two.d.ts'
monaco.languages.typescript.typescriptDefaults.addExtraLib(
`declare module '@my-project/package-one' { ${source1} }`,
'file:///node_modules/@my-project/package-one/index.d.ts' // irrelevant?
);
monaco.languages.typescript.typescriptDefaults.addExtraLib(
`declare module '@my-project/package-two' { ${source2} }`,
'file:///node_modules/@my-project/package-two/index.d.ts' // irrelevant?
);
monaco.editor.create(document.getElementById('root'), {
value: `
import { Foo } from '@my-project/package-one';
const foo = new Foo();
`,
language: 'typescript',
theme: 'vs-dark'
});
我可以看到如何在 Monaco 中使用 addExtraLib
添加环境声明文件。不清楚的是如何将此函数与外部声明文件一起使用,以便编辑器中的 Typescript 代码可以执行以下操作:
import * as External from "external"
External.foo();
在摩纳哥设置方面,这似乎不起作用:
// compiler options
monaco.languages.typescript.typescriptDefaults.setCompilerOptions({
target: monaco.languages.typescript.ScriptTarget.ES2016,
allowNonTsExtensions: true,
moduleResolution: monaco.languages.typescript.ModuleResolutionKind.NodeJs,
module: monaco.languages.typescript.ModuleKind.CommonJS,
noEmit: true,
noLib: true,
typeRoots: ["node_modules/@types"]
});
// extra libraries
monaco.languages.typescript.typescriptDefaults.addExtraLib(
'export declare function foo():string;', 'node_modules/@types/external/index.d.ts');
monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({
noSemanticValidation: false,
noSyntaxValidation: false
经过一番尝试,我找到了解决办法。基本上,文件必须使用 createModel
和显式文件 URL 加载。如果您这样做,则 node_module/@types
的相对文件路径有效。这是我可以在操场上使用的工作解决方案:
// compiler options
monaco.languages.typescript.typescriptDefaults.setCompilerOptions({
target: monaco.languages.typescript.ScriptTarget.ES2016,
allowNonTsExtensions: true,
moduleResolution: monaco.languages.typescript.ModuleResolutionKind.NodeJs,
module: monaco.languages.typescript.ModuleKind.CommonJS,
noEmit: true,
typeRoots: ["node_modules/@types"]
});
// extra libraries
monaco.languages.typescript.typescriptDefaults.addExtraLib(
`export declare function next() : string`,
'node_modules/@types/external/index.d.ts');
monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({
noSemanticValidation: false,
noSyntaxValidation: false
})
var jsCode = `import * as x from "external"
const tt : string = x.dnext();`;
monaco.editor.create(document.getElementById("container"), {
model: monaco.editor.createModel(jsCode,"typescript",new monaco.Uri("file:///main.tsx")),
});
Joe 的回答对我不起作用,通过在外部类型定义文件路径前加上 file:///
这是 playground 的更新示例:
monaco.languages.typescript.typescriptDefaults.addExtraLib(
'export declare function add(a: number, b: number): number',
'file:///node_modules/@types/math/index.d.ts'
);
const model = monaco.editor.createModel(
`import {add} from 'math';\nconst x = add(3, 5);\n`,
'typescript',
monaco.Uri.parse('file:///main.tsx')
);
monaco.editor.create(document.getElementById('container'), {model});
没有必要提供编译器选项和诊断选项。
截至 2021 年 4 月 (monaco-editor@0.23.0
),如果没有基于 monaco-editor#2295, monaco-editor#1839, and
- 将每个包中的 所有 个文件捆绑到一个文件中。 TypeScript doesn't make this easy, and so instead I used dts-bundle-generator,但存在其他解决方案。
- 使用 raw-loader 或其他纯文本加载替代方法为每个包导入
.d.ts
内容。 - 使用每个模块的源代码调用
addExtraLib
,向源代码添加显式declare module 'module-name'
。
完整示例如下:
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
import source1 from '!!raw-loader!./types/package-one.d.ts';
import source2 from '!!raw-loader!./types/package-two.d.ts'
monaco.languages.typescript.typescriptDefaults.addExtraLib(
`declare module '@my-project/package-one' { ${source1} }`,
'file:///node_modules/@my-project/package-one/index.d.ts' // irrelevant?
);
monaco.languages.typescript.typescriptDefaults.addExtraLib(
`declare module '@my-project/package-two' { ${source2} }`,
'file:///node_modules/@my-project/package-two/index.d.ts' // irrelevant?
);
monaco.editor.create(document.getElementById('root'), {
value: `
import { Foo } from '@my-project/package-one';
const foo = new Foo();
`,
language: 'typescript',
theme: 'vs-dark'
});