在Typescript中,如何区分节点和普通Javascript错误类型?
我有以下功能:在Typescript中,如何区分节点和普通Javascript错误类型?,javascript,node.js,typescript,Javascript,Node.js,Typescript,我有以下功能: /** * Retrieves a component template from filesystem */ const getComponentTemplate = async ( p: string ): Promise<string> => { let template: string try { template = await fs.readFile(p, { encoding: 'utf8' }) }
/**
* Retrieves a component template from filesystem
*/
const getComponentTemplate = async (
p: string
): Promise<string> => {
let template: string
try {
template = await fs.readFile(p, {
encoding: 'utf8'
})
} catch (e) {
if (e instanceof Error && e.code === 'ENOENT') {
throw new Error(`template for element type ${elementType} not found`)
}
throw e
}
return template
}
您可以考虑使用方括号读取<代码>代码<代码>属性,然后检查其值是否等于“代码> ENONOT/<代码>:
try {
...
} catch (e) {
const code: string = e['code'];
if (code === 'ENOENT') {
...
}
throw e
}
这不是一个完美的解决方案,但考虑到您不能在catch子句中声明类型,并且ErrnoException检查的
e instanceof ErrnoException
无法正常工作(如问题注释中所述)。我最后使用了@AndyJ的注释:
/**
* Retrieves a component template from filesystem
*/
const getComponentTemplate = async (
p: string
): Promise<string> => {
let template: string
try {
template = await fs.readFile(p, {
encoding: 'utf8'
})
} catch (e) {
// tslint:disable-next-line:no-unsafe-any
if (isNodeError(e) && e.code === 'ENOENT') {
throw new Error(`template for element type ${elementType} not found`)
}
throw e
}
return template
}
/**
* @param error the error object.
* @returns if given error object is a NodeJS error.
*/
const isNodeError = (error: Error): error is NodeJS.ErrnoException =>
error instanceof Error
/**
*从文件系统检索组件模板
*/
常量getComponentTemplate=async(
p:字符串
):承诺=>{
让模板:字符串
试一试{
template=wait fs.readFile(p{
编码:“utf8”
})
}捕获(e){
//tslint:禁用下一行:无任何不安全
if(isNodeError(e)&&e.code=='enoint'){
抛出新错误(`template for element type${elementType}未找到`)
}
掷e
}
返回模板
}
/**
*@param error返回错误对象。
*@如果给定的错误对象是NodeJS错误,则返回。
*/
const isNodeError=(错误:error):错误为NodeJS.ErrnoException=>
错误实例
但我惊讶地看到这是必要的。如果您正在使用任何规则,它还要求您遵守这些规则。如果您想使用try/catch,那么您将得到一个您不知道其类型的对象 您已经测试过的代码可以查看该对象是否是,如果是,则将其转换为“普通”JS对象 您可以使用来告诉类型系统对象实际上是什么类型 大致如下:
function isError(error: any): error is ErrnoException { return error instanceof Error; }
我看了一下,似乎使用该函数以及整个节点api的一种常见方法是通过向它传递一个回调,该回调在作业完成或出现错误时被调用 看一下,它表明传递给回调的错误对象确实是所需的 因此,使用回调将消除对类型guard的需要,并且似乎是实现这一点的节点方式 显然,详细说明了“收回所有东西”方法背后的一些想法 Node大量使用回调可以追溯到一种编程风格 比JavaScript本身更古老。连续传球方式(CPS)是 Node.js现在如何使用回调的老校名。在CPS中,一个 “continuation function”(读作:“callback”)作为参数传递给 在该代码的其余部分运行后调用。这允许 不同的功能,以异步手动控制来回 跨越应用程序 js依靠异步代码保持快速,因此 可靠的回调模式至关重要。如果没有它,开发人员将 在每个和之间保持不同的签名和样式 每个模块。将错误优先模式引入节点核心,以 解决这个问题,并已成为今天的流行 标准而每个用例都有不同的需求和 对于响应,错误优先模式可以容纳所有响应
e instanceof Error
您正在测试它是否是错误
而不是错误异常
。我不确定告诉它正确类型的最佳方法是什么,但“快速n脏”的方法是e instanceof Error&&(e as ErrnoException)。code==='enoint'
。您可能可以按照以下方式制作一个typeguard:函数isError(Error:any):Error是ErrnoException{return Error instanceof Error;}
但如果这样的东西还不存在,我会感到惊讶。你会发现这是一个普遍的要求!我意识到我可以将用作,但这似乎有点脏。Typescript难道不应该知道我正在节点中运行吗?如果(e instanceof ErrnoException)
正好满足您的需要,那么难道不应该吗?@arvymetal否,因为该类实际上是Error
(由节点提供的类)ErrnoException
只是一个接口,不是一个类。因此,e不是它的一个实例。请注意,节点的Error
实现了ErrnoException
,但由于某些原因,Typescript没有实现这一点。谢谢您——考虑到错误处理的常见性,如果这是推荐的方法,我会感到惊讶。感谢您的输入!typeguard似乎解决了这个问题,不过我必须使用tslint ignore注释来使用any
。这篇支持收回的帖子是从2014年开始的。从那时起,情况发生了很大变化。人们倾向于避免回调以避免深度嵌套的结构<代码> Acyc/AsAs/<代码>被广泛采用,我不认为它是回到旧时代的解决方案,因为Typescript无法解决错误类实际上是从节点而不是ES6的问题。我想接受您对Typeguard的回答,但不接受回调建议。
function isError(error: any): error is ErrnoException { return error instanceof Error; }
export function readFile(path: PathLike | number, callback: (err: NodeJS.ErrnoException, data: Buffer) => void): void;