Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Typescript中,如何区分节点和普通Javascript错误类型?_Javascript_Node.js_Typescript - Fatal编程技术网

在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;