Typescript ignoring the fs.d.ts definition for MakeDirectoryOptions
为什么不编译?
1 2 3 | import * as fs from 'fs'; var folder: string ="c:/test1/test2/test3/"; fs.mkdirSync(folder, { recursive:true }); // the {object} shows an error |
我是使用MS Visual Studio 2019社区的TypeScript新手。将工作的Node.JS代码转换为TypeScript。我在项目启动时调用了一个函数。该代码在Node.JS中有效,但在TypeScript中显示编译错误。
fs.mkdirSync(folder,{recursive:true}); // {object}无法编译。
我看不到为什么我不允许传递指定递归位的对象。目前在新手荒野中徘徊。建议将不胜感激。
当我将鼠标悬停在编译错误上时,会出现以下弹出窗口:
1 2 3 4 | (property) recursive: boolean (TS) Argument of type '{ recursive: boolean }' is not assignable to parameter of type 'string | number'. Type '{ recursive: boolean }' is not assignable to type 'number'. |
它似乎忽略了MakeDirectoryOptions的fs.d.ts定义:
到目前为止,我做了什么:
1)我搜索了驱动器C :,并找到了4个fs.d.ts文件。每个都包含以下定义:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | function mkdirSync(path: PathLike, options?: number | string | MakeDirectoryOptions | null): void; export interface MakeDirectoryOptions { /** * Indicates whether parent folders should be created. * @default false */ recursive?: boolean; /** * A file mode. If a string is passed, it is parsed as an octal integer. If not specified * @default 0o777. */ mode?: number; } |
2)我尝试过修改package.json设置:
1 2 3 4 | "devDependencies": { "@types/node":"^8.0.14", "typescript":"^3.2.2" // forcing this to use the latest 3.6.0 } |
重现该问题的代码:
----- server.ts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import * as fs from 'fs'; //import fs = require("fs"); // does not work //var fs = require("fs"); // compiles var folder:string ="c:/test1/test2/test3/"; var result: string ="untested"; try { // test for the existance of a folder if (!fs.existsSync(folder)) { // create the folder if found to not exist fs.mkdirSync(folder, { recursive: true }); // { recursive: true } shows as compile error result ="created"; } else { result ="exists already"; } }catch(err) { result = err.message; } import * as http from 'http'; var port: number | string = process.env.port || 1337 http.createServer(function (req, res) { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Operation result: = ' + result +"\ "); }).listen(port); |
----- package.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | { "name":"trials", "version":"0.0.0", "description":"trials", "main":"server.js", "author": { "name":"" }, "scripts": { "build":"tsc --build", "clean":"tsc --build --clean" }, "devDependencies": { "@types/node":"^8.0.14", "typescript":"^3.2.2" } } |
----- tsconfig.json
1 2 3 4 5 6 7 8 9 10 11 | { "compilerOptions": { "module":"commonjs", "target":"es6", "lib": ["es6"], "sourceMap": true }, "exclude": [ "node_modules" ] } |
-----代码结尾
如果我将"导入*从'fs'更改为fs";行到:
var fs = require(" fs");
一切都可以编译和运行-但是我认为这是作弊吗?
它似乎忽略了MakeDirectoryOptions的fs.d.ts定义:
函数mkdirSync(path:PathLike,options ?: number | string | MakeDirectoryOptions | null):void;
导出接口MakeDirectoryOptions {etc ....}
我在这里找到了答案:
https://github.com/DefinitelyTyped/DefinitelyTyped/issues/34980
对于TypeScript新手来说,以上答案仍然令人困惑,因此我对类型进行了全局卸载并重新安装了最新版本。 我以管理员身份打开命令提示符,并键入如下。
1 2 | npm uninstall -g @types/node npm install -g @types/node@latest |
这似乎已经解决了问题。 如有其他建议,请告知。