fs.readFile(string,encoding) - TS2345

时间:2017-09-25 11:16:44

标签: node.js typescript

我正在尝试使用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

4 个答案:

答案 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”(或其他一些有效字符串)是正确的,但打字稿编译器需要微调才能弄清楚。打字稿很难,即使对于编译器也是如此。