在 TypeScript 的严格模式下,当对象未被找到时应该返回什么?

4

以下是启用 strictNullChecks: true 的 TypeScript 代码片段:

getItem(key: string): T {
    let index: number = this.contains(key); // returns -1 if not found
    if (index === -1) {
        return null; // error null is not assignable to type 'T'
    } 
    return this.map[index].value;
  }

如您所见,当我未找到元素时,无法返回null,因为会发生编译错误:

错误:'null' 无法赋值给类型 'T'

我该返回什么而不是null呢?有什么最佳实践吗?


1
为什么不直接将返回类型的注释改为包含 null 呢?例如:getItem(key: string): T | null { ... } - CRice
如何允许函数返回Tnull? getItem(key: string): T | null - 顺带一提,我从不在JavaScript / TypeScript中使用null: https://github.com/Microsoft/TypeScript/issues/8940 - random_user_name
这是最佳实践吗?当您从不使用null时,您会使用什么代替null? - Martin Čuka
1
在您的具体示例中,我会根据您的映射内容使用falseundefined。我相信这是“最佳实践”,但没有权威来源支持这种信念。一些数据点:https://github.com/Microsoft/TypeScript/issues/8940和https://www.thecodeship.com/web-development/the-undefined-vs-null-pitfall-in-javascript/和https://dev59.com/xWw15IYBdhLWcg3wcrZC#28825847 - 使用null需要额外的工作/复杂性来检查值... - random_user_name
1个回答

4
使用严格的空值检查,任何返回“未找到”内容的函数都应该将返回类型声明为Something | undefined,并在“未找到”情况下返回undefined值。
也可以使用null代替undefined,作为类型和返回值,但是选择了TypeScript类型系统使用undefined来表示未初始化和可选值,例如,可选属性(用?符号声明)的类型是T | undefined
另请参见用户cale_b在评论中提到的此引用

理由是JavaScript有两个概念来引用空的标记值,而大多数其他编程语言只有一个。此外,未初始化的所有值在运行时都具有undefined值,因此undefined始终存在。另一方面,null是可以避免的,特别是如果您不使用产生它的任何API,例如DOM,TypeScript编译器就不会使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接