我在一个函数中有下面一行代码:

if (!document) return;

出于某种原因,我从官方TypeScript规则中得到了以下ESLint错误:

不必要的条件,值总是 假的.eslint(@ typescript—eslint/no—needed—condition)

document并不总是真实的.当代码在服务器上运行时,在Node.js程序中或作为react服务器组件的一部分运行时,document对象不可用.

有没有办法让TypeScript理解document可能是undefined

EDIT:

我希望代码能够在both node.js(服务器)环境和浏览器环境中运行.因此,eslint config中的env被设置为{ node: true, browser: true, },并通过此tsconfig:"lib": ["ESNext", "DOM", "DOM.Iterable"],包含lib.dom.d.ts

推荐答案

global document variable is declared in lib.dom.d.tsDocument,而不是Document | undefined或其他任何东西.

现在你有两个 Select :包含它并接受document是一个Document,或者不包含它,然后document根本就不知道是一个变量. TypeScript目前还没有"有条件地"包含库的功能,因此不支持使用运行时方法来发现DOM是否存在的用例.

microsoft/TypeScript#53971处有一个开放的特性请求,要求对这样的多环境代码提供更好的支持,但它的参与很少,所以我不希望看到它很快实现.

所以现在唯一的方法是不包含lib.dom.d.ts,而是包含或声明你自己的版本,其中document是类型Document | undefined(但是你必须小心地访问它作为globalThis.document而不是仅仅document,因为取消引用一个缺失的变量会导致a ReferenceError而不是undefined(或者如果你想不用担心使用document,你可以在代码的顶部写globalThis.document ||= undefined,这样document就绝对是一个全局变量了).

这将是一项巨大的事业,目前还不清楚你会受益多少. 为了方便起见,我建议您只使用type assertions或 suppress 这一行的lint规则,或者其他一些解决办法,这些办法实际上不会保护您可能不存在的DOM,但至少不会在您的环境中给您错误.

Typescript相关问答推荐

排序更改数组类型

了解TS类型参数列表中的分配

是否可以根据嵌套属性来更改接口中属性的类型?

为什么TypeScript失go 了类型推断,默认为any?''

从typescript中的对象数组中获取对象的值作为类型'

状态更新后未触发特定元素的Reaction CSS转换

TypeScrip表示该类型不可赋值

使用打字Angular 中的通用数据创建状态管理

参数属性类型定义的REACT-RUTER-DOM中的加载器属性错误

TS2339:类型{}上不存在属性消息

从子类构造函数推断父类泛型类型

ApexCharts条形图未显示最小值.负值

是否可以判断某个类型是否已合并为内部类型?

如何在省略一个参数的情况下从函数类型中提取参数类型?

React router 6(数据路由)使用数据重定向

有没有办法防止类型交集绕过联合类型限制?

从route.参数获取值.订阅提供";无法读取未定义";的属性

在打字脚本中对可迭代对象进行可变压缩

为什么TS条件返回要求不明确的强制转换而不是精确的强制转换?

从 npm 切换到 pnpm 后出现Typescript 错误