【问题标题】:What is the purpose of this code in below?下面这段代码的目的是什么?
【发布时间】:2020-07-30 04:35:22
【问题描述】:
const fullNameMaxLength = 10;

class Employee {
private _fullName: string;

set fullName(newName: string) {
    if (newName && newName.length > fullNameMaxLength) {
        throw new Error("fullName has a max length of " + fullNameMaxLength);
    }

    this._fullName = newName;
}
}

if (newName && newName.length > fullNameMaxLength)

我可以理解检查 newName 在 vanillaJS 中是否真实,但是在 Typescript 中这样做的目的是什么? Typescript 已经保证 newName 是字符串并且它具有 .length 属性。

完整代码在这里: https://www.typescriptlang.org/docs/handbook/classes.html

【问题讨论】:

  • TypeScript 在运行时不存在,进行基本的运行时检查以避免错误仍然很有用。
  • @jonrsharpe 但是所有代码都是 Typescript 并且经过编译以检查是否存在滥用。
  • TypeScript 不保证 newName 是一个字符串并且具有 length 属性。它保证任何它知道的代码都会将该属性设置为string
  • @HereticMonkey Monkey 我想我们说的是同一件事,但方式不同。

标签: typescript accessor notnull


【解决方案1】:

假设所有代码都是typescript,由typescript编译,没有涉及到any,那么这个存在性检查是没有用的。

但是,正如其他评论者指出的那样,如果任何代码是纯 javascript,或者作为库公开用于未知代码库或环境,则无法保证类型安全。因此,由开发人员决定是否进行双重检查。

但是,这里有一些方法仍然可以这样写:

  1. 非打字稿调用者
// foo.js
employee.fullName = null // not typescript so no error.
  1. 可能会传入一种any
// foo.ts
const jsonData: any = { employees: [{ fullName: null }] } // data from a remote api

// no error because `any` be cast to any other type without error.
employee.fullName = jsonData.employees[0].fullName is any.

存在性检查将防止这两种情况引发错误。但是,下一行无论如何都会分配错误的值...

我认为,作为打字稿文档中的示例,存在性检查可能不应该存在,因为它有点令人困惑。

【讨论】:

【解决方案2】:

你不能只使用

newName > fullNameMaxLength

因为 newName 可以是 undefined/null ,在这种情况下,你会得到一个未处理的错误。

Uncaught TypeError: Cannot read property 'length' of undefined

接下来,您需要检查 newName.length 并与 fullNameMaxLength 进行比较。

【讨论】:

  • Typescript 编译器会提醒您这种不一致。您不能将 null/undefined 分配给字符串类型。所有代码都是用 Typescript 编写的。
  • 但是你不能确定这个变量是否包含实际值,特别是如果你从 api 获取这个数据。
  • 你需要这样定义数据: let data:unknown;然后在将数据分配给任何字符串变量之前检查类型或进行类型转换。这是有效的 Typescript 方式。
  • 提问者询问的是存在性检查,而不是长度属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2019-11-02
  • 2020-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多