打字稿阻止简单的长度检查,因为条件隐藏了有用的方法和属性

Posted

技术标签:

【中文标题】打字稿阻止简单的长度检查,因为条件隐藏了有用的方法和属性【英文标题】:Typescript preventing simple length check as conditional conceals helpful methods and properties 【发布时间】:2022-01-02 02:33:49 【问题描述】:

这是一道打字稿题,以discord.js为例,不需要懂库来帮忙。

我正在从普通的 js 转换我的应用程序,当我调用一个方法时,它会为我提供一个带有键和值的地图类型。现在我正在使用 typescript 并且库具有类型定义,我无法再检查响应的大小。

const attachments = interaction.options.getMessage('message', true).attachments;

所以以前我可以只调用 size 属性,但现在我仅限于这些类型:

附件:集合 | API附件[]

使用 as 关键字只选择一个条件句是不好的做法,以便我有更多的属性可以使用?如何获得附件的大小或安全地解析为一种类型?它们只有迭代器。

我了解打字稿的好处,并避免使用任何 hacky 解决方案。我正在努力学习更好地使用 typescript,并希望使用库提供给我的类型。

【问题讨论】:

我以前从未见过APIAttachment...我会说使用as Collection<string, MessageAttachment> 很好 【参考方案1】:

我会推荐这个简单的修复方法

你可以这样做:

如果您希望附件成为一个集合

import  Collection  from "discord.js"
    
if(attachments instanceof Collection)
    // Do this

或者如果你希望附件是一个数组

import  Collection  from "discord.js"

if(!(attachments instanceof Collection))
    // Do that

TypeScript 然后会自动检测attachments 是一个数组或集合

【讨论】:

以上是关于打字稿阻止简单的长度检查,因为条件隐藏了有用的方法和属性的主要内容,如果未能解决你的问题,请参考以下文章

在条件中使用打字稿变量

打字稿'条件'类型

React 条件渲染组件打字稿

打字稿:检查类型是不是为联合

基于属性的打字稿方法返回类型

打字稿 - 条件要求