Typescript 将错误的类型分配给变量(使用 fs 模块)

Typescript assigns wrong types to variables (using fs modules)

fs.promises.readFile(filePath, {encoding: "utf8")) returns any 而它应该 return string.

如果我将鼠标悬停在 readFile 上,它会显示:

ts 文件:

const fs = require('fs');
const path = require('path');

async function doSomething():Promise<Array<string>> {
    const fileText = await fs.promises.readFile(path.join(__dirname, "testFile"), {encoding: "utf8"});
    const rows = fileText.split(/\n|\r\n|\r/);
    const splitRows = rows.map(value => value.split('\t'));
    return splitRows;
}

测试文件内容:

columnA1    columnB1
columnA2    columnB2

编译器应该抛出错误,因为 doSomething returns Promise<Array<Array<string>>> 而不是 Promise<Array<string>>.

如果我将函数中的第一行更改为:

const fileText:string = await fs.promises.readFile(path.join(__dirname, "testFile"), {encoding: "utf8"});

编译器正常运行。

我不明白为什么它不能将 fileText 识别为字符串。

即使 fileText 不是字符串,它也应该知道 split return 是一个数组,对吗?

通过使用 require,您可以无类型地导入 fspath。 (如果你将鼠标悬停在其中任何一个上,它应该显示 any。)如果你使用 import 语法,编译器将按你预期的方式运行:

import * as fs from 'fs';
import * as path from 'path';

async function doSomething():Promise<Array<string>> {
    const fileText = await fs.promises.readFile(path.join('__dirname', "testFile"), {encoding: "utf8"});
    const rows = fileText.split(/\n|\r\n|\r/);
    const splitRows = rows.map(value => value.split('\t'));
    return splitRows;
}

TypeScript playground