问题标签 [strictnullchecks]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
261 浏览

angular - 使用 strictNullChecks 从可能为 null 的属性中键入别名

graphql-codegen/typescript-apollo-angular用来生成打字稿的代码可以在我们的 Angular 应用程序中使用。我们决定启用strictNullChecks唯一的问题是我们使用以下模式来指定 API 返回的内部节点的类型:

在我的情况下somethingMaybe<Array<...>>它是正确的。当我启用strictNullChecks上述代码时,由于某些内容也可能未定义/为空,因此不再起作用。

我无法找到有关如何从这样的类型别名中删除null/类型的文档。undefined也许有不同的方法可以做到这一点。

0 投票
1 回答
465 浏览

typescript - 我可以在 TypeScript 严格的 null 检查模式下禁用区分 null 和 undefined 吗?

我目前正在将大型 TypeScript 代码库转换为严格的空检查。代码库有许多带有可选成员的类型:

此外,它使用 type Nullable<T> = T | null,并且有许多return null语句。

现在我面临许多编译器错误,这些错误基本上表明T | null无法转换为T | undefined,反之亦然,就像在这个例子中一样:

null我喜欢 TypeScript 中严格的 null 检查,但我没有用和之间的区别undefined。我可以理解在某些用例中区分null和是有意义的undefined,但在这个项目中,它实际上并没有发挥重要作用。这些函数return null什么都不返回——不管是null还是undefined. 可选成员也是如此——它们要么设置为一个值,要么不设置。

我也更喜欢不转换member1?: number;to member1: Nullable<number>;,而是保持return null原样

我可以至少在 TypeScript 中禁用undefinedand之间的区别吗?null

0 投票
0 回答
40 浏览

typescript - Typescript:如何为增量编译和 strictNull 检查计算文件依赖关系

我们有一个大型 Typescript 项目,我们正在尝试改进增量编译时间,这有时会占据开发时间。对于很多文件,如果我们遵循所有的import语句,我们将到达项目的大部分文件,因此增量编译可能会非常慢。我们正在努力减少此图中的连接性,但我们也注意到,对于我们在 Typescript 文件中所做的一些更改,导入文件不会使用 --incremental 或在监视模式下重新编译。

例如,更改类中的方法主体(但不更改其签名)不会导致重新编译导入该类的文件。此外,将(软和硬)私有字段添加到类或文件本地声明似乎不会导致重新编译导入程序。

但是,我们注意到,当使用 mixin 模式 ( https://www.typescriptlang.org/docs/handbook/mixins.html ) 时,对 mixin 类的任何更改都会导致重新编译所有导入器,甚至添加硬私有字段。似乎使用导入/导出类型对依赖项没有任何影响,但我们却没有找到相关文档。

如果增量编译,是否有正式的文档说明什么构成了依赖项?这个依赖图是否可以从编译器(或增量编译输出)获得?更实际的是,有没有一种方法可以在不创建私有字段和方法实现的编译依赖项的情况下使用 mixin?我们只能通过为所有涉及的类引入接口来解决这个问题,但这非常麻烦并且会导致其自身的问题。似乎不可能将项目划分为子项目并使用项目引用,因为在任何这样的划分中我们都会得到循环依赖。

为了进行 strictNull 检查,我们尝试按照建议逐步将它们引入我们的代码,但是将一个文件添加到检查文件列表中也会添加它传递导入的所有文件(或者看起来如此)。是否有此处使用的依赖关系的正式文档?它与增量编译的相同吗?

0 投票
0 回答
16 浏览

javascript - 启用 strictNullChecks,使用可选参数调用泛型方法会导致后续方法调用出现打字错误

我有一种情况,我有一个通用函数,它接受一个类型参数,然后根据该类型调用另一个更具体的函数。我将一个可选参数传递给某些特定函数但并非所有函数都需要的通用函数。因为参数是可选的,所以我在尝试调用特定函数时遇到输入错误,该函数需要参数且可能未定义。下面的代码或这里的stackblitz 。有没有办法我可以正确输入它以便它通过 strictNullChecks?

0 投票
1 回答
49 浏览

typescript - 有没有一种好方法可以告诉打字稿所有数组元素都存在于地图中?

假设我正在从一个以 id 作为键的对象数组创建一个 Map,然后从具有相同 id 的不同数组访问该映射:

如果我有“strictNullChecks”:true,那么最后一行会抛出一个“对象可能是'未定义'”错误,即使它永远不会是未定义的。有没有办法告诉打字稿数组中的元素存在于地图中?

我知道我可以使用“!” 运算符,或创建一个只返回 T 而不是 T | 的函数 undefined 来替换 Map.get,但有没有更好的方法来实现这一点?

0 投票
0 回答
16 浏览

typescript - 为什么使用 strictNullChecks=true 的打字稿在访问对象的属性时不会抱怨?

可能有什么我不明白的。在这段代码中,我希望打字稿对该行发出警告,page.name = 'foo';因为page可以为空?

有人可以解释一下吗?谢谢!

操场

0 投票
1 回答
27 浏览

typescript - 类型缩小:当 noUncheckedIndexedAccess 为 true 时检查变量对象键是否存在

"noUncheckedIndexedAccess": true在我的tsconfig.json. 切换的重点是在访问之前强制检查索引中的项目是否存在。

我很难用变量键检查对象:

假设我有以下结构:

当我尝试使用文字键检查是否存在时,类型缩小工作正常:

如果我尝试使用变量键检查是否存在,编译器就会开始抱怨。

为什么不能以这种方式检查存在?

我甚至尝试了不同的检查:

那里没有运气。

唯一有效的是

不过我觉得有点太啰嗦了。

▶️ TypeScript Playground 中的示例

环境: TypeScript v4.5.4

0 投票
0 回答
15 浏览

typescript - 因为 `strictNullChecks` 函数的返回类型是 `| 未定义`虽然它永远不会是未定义的

功能如下:

如下使用时:

返回类型boolean | undefined虽然我期望并且需要它是boolean.