我正在尝试使用import {readFile} from 'fs';
let str = await readFile('my.file', 'utf8');
这样的打字稿......
public interface ILogger
{
void Log(LogLevel level, string message);
void Log(LogLevel level, string format, params object[] arguments)
{
Log(level, string.Format(format, arguments));
}
}
导致此错误:
TS2345:类型'“utf8”'的参数不能分配给'(err:ErrnoException,data:Buffer)=>类型的参数。无效“
我正在使用 Typescript 2.5.2 和 @ types / node 8.0.30
答案 0 :(得分:1)
“await”适用于Promise,不适用于回调。 Node 8.5.0从头开始支持promisify。使用
const util = require('util');
const fs = require('fs');
const asyncReadFile = util.promisify(fs.read);
let str = await asyncReadFile('my.file', 'utf8');
//OR
asyncReadFile('my.file', 'utf8').then( (str) => {
...
})
快乐的编码!
答案 1 :(得分:0)
当3rd是回调时,第3个参数只能是一个字符串(编码),请参阅类型定义中的签名:
export function readFile(path: PathLike | number, options: { encoding: string; flag?: string; } | string, callback: (err: NodeJS.ErrnoException, data: string) => void): void;
因此,通过添加回调,它将起作用:
readFile('my.file', 'utf8', () => {
});
或使用promisification库生成回调并与await
一起使用:
let str = promisify('my.file', 'utf8');
答案 2 :(得分:0)
在我的情况下,Promisify也不起作用。最后,我通过确保文件已使用'utf8'编码以及以下读取方式进行管理,从而完成了类似的任务:
let asset_content = null;
try {
await RNFetchBlob.fs.readFile(assetFile_path, 'utf8')
.then((data) => {
asset_content = data;
console.log("got data: ", data);
})
.catch((e) => {
console.error("got error: ", e);
})
} catch (err) {
console.log('ERROR:', err);
}
const assets = JSON.parse(asset_content);
答案 3 :(得分:0)
我正在使用 Typescript 4.2 和“fs/promises”。我有同样的问题。这有效
import * as fsp from 'fs/promises'
await fsp.writeFile(filename, data,'utf-8' as BufferEncoding)
我们可以在文件 .../node_modules/@types/node/globals.d.ts
中找到 BufferEncoding
的定义:
// Buffer class
type BufferEncoding = "ascii" | "utf8" | "utf-8" | "utf16le" | "ucs2" | "ucs-2" | "base64" | "latin1" | "binary" | "hex";
所以“utf-8”(或其他一些有效字符串)是正确的,但打字稿编译器需要微调才能弄清楚。打字稿很难,即使对于编译器也是如此。