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
,您可以无类型地导入 fs
和 path
。 (如果你将鼠标悬停在其中任何一个上,它应该显示 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;
}
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
,您可以无类型地导入 fs
和 path
。 (如果你将鼠标悬停在其中任何一个上,它应该显示 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;
}