【发布时间】:2019-01-02 13:05:04
【问题描述】:
我有以下功能:
/**
* 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
}
Typescript 在这里抱怨:
[ts] Property 'code' does not exist on type 'Error'
这是因为 Javascript Error 类只有属性 message and name。
但是,Node 的 Error 类确实有一个 code property。
Typescript 在一个特殊的接口ErrnoException 中定义了这个(参见源代码here)。我已将@types/node 添加到我的package.json 中,但这并没有让Typescript 意识到这个Error 是ErrnoException 接口的一部分。
不能在 catch 子句中声明类型注释。那么,如何让 Typescript 编译器能够解决这是一个节点错误呢?
仅供参考,这是我tsconfig.json 的一部分:
{
"compilerOptions": {
"target": "es2017",
"module": "commonjs",
"lib": ["es2017"]
...
}
}
【问题讨论】:
-
e instanceof Error您正在测试它是否是Error而不是ErrnoException。我不确定告诉它正确类型的最佳方式,但“快速和肮脏”的方式是e instanceof Error && (e as ErrnoException).code === 'ENOENT'。 -
您可能可以按照以下方式制作类型保护:
function isError(error: any): error is ErrnoException { return error instanceof Error; }尽管如果这样的东西不存在,我会感到惊讶。你会这将是一个常见的要求! -
我意识到我可以使用
as,但这似乎有点脏。 Typescript 不应该知道我在 Node 中运行吗? -
if (e instanceof ErrnoException)不能满足您的需求吗? -
@arvymetal 否,因为该类实际上是
Error(Node 提供的那个)。ErrnoException只是一个接口,不是一个类。因此 e 不是它的一个实例。请注意,Node 的Error实现了ErrnoException,但由于某种原因 Typescript 没有实现这一点。
标签: javascript node.js typescript