我有一个读取文件的函数readFile,可以将多个参数传递给它:readFile('folder', 'target', e => console.error(e))
字符串参数是文件的路径,最后一个参数是错误处理函数。
该函数如下所示:
import * as p from 'path';
type ErrorHandler = (e: Error, path: string) => any | void;
type ReadFileParams = (Array<string> & ErrorHandler) | Array<string>;
export const readFile = (...params: ReadFileParams): object | null => {
const source: Array<string> = params.filter(o => typeof o === 'string');
const errorHandler =
params.find(o => typeof o === 'function') ||
((e: Error) => {
throw e;
});
const path = p.resolve(...source);
try {
const data = fs.readFileSync(path, 'utf8');
return JSON.parse(data);
} catch (e) {
(<ErrorHandler>errorHandler)(e, path);
}
return null;
};
虽然我只用字符串参数调用 - ts 并不发誓。
一旦我将最后一个参数传递给函数,例如:
readFile(source, files[0].name, () => {});
显示以下错误消息:
TS2345: Argument of type '[string, string, () => void]' is not
assignable to parameter of type 'ReadFileParams'.
Type '[string, string, () => void]' is not assignable
to type 'string[] & ErrorHandler'.
Type '[string, string, () => void]' is not assignable
to type 'string[]'.
Type 'string | (() => void)' is not assignable
to type 'string'.
Type '() => void' is not assignable to type 'string'.
在给定情况下如何正确描述类型?

有一个沙箱
Object.prototype.toString.call- 更可靠+一点魔法
在这里,同样,小的编辑,我们使用前一个块的魔法