问题
I can see how to use addExtraLib
in Monaco to add an ambient declaration file. What's not clear is how to use this function with an external declaration file so that Typescript code in the editor can do a:
import * as External from "external"
External.foo();
On the Monaco set-up side, this doesn't seem to work:
// 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
})
回答1:
After playing around a little I found a solution. Basically, the file has to be loaded using createModel
with an explicit file URL. If you do this then the relative file path for node_module/@types
works. Here's my working solution that can be used in the playground:
// 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")),
});
回答2:
Joe's answer didn't work for me, fixed by prefixing the external type definition file path with file:///
Here's an updated example for the 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});
It's not necessary to provide the compiler options and diagnostic options.
来源:https://stackoverflow.com/questions/43058191/how-to-use-addextralib-in-monaco-with-an-external-type-definition