Какова цель этого кода ниже? - PullRequest
0 голосов
/ 16 апреля 2020
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;
}
}

если ( newName && newName.length> fullNameMaxLength)

Я могу понять, что newName является правдивым или не в ванили JS, а в Typescript какова цель этого? Typescript уже гарантирует, что newName является строкой и имеет свойство .length .

полный код здесь: https://www.typescriptlang.org/docs/handbook/classes.html

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Если предположить, что весь код является машинописным и скомпилирован с помощью машинописного текста, а значение any не задействовано, то эта проверка существования не имеет смысла.

Однако, как указывают другие комментаторы, если какой-либо код прост javascript или в виде библиотеки для использования в неизвестных кодовых базах или средах безопасность типов не может быть гарантирована. Так что разработчик должен решить сделать двойные проверки.

Но вот несколько способов, которые все еще могут быть хороши, написав это таким образом:

  1. нетипичный вызывающий абонент
// foo.js
employee.fullName = null // not typescript so no error.
тип 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.

Проверка существования защитит от ошибки, возникающей в обоих этих случаях. Однако следующая строка в любом случае присвоит неверное значение ...

Я бы сказал, что в качестве примера в документах по машинописи проверки существования, вероятно, не должно быть, поскольку это немного сбивает с толку.

0 голосов
/ 16 апреля 2020

Вы не можете использовать только

newName > fullNameMaxLength

, потому что newName может быть undefined / null, и в этом случае вы получите необработанную ошибку.

Uncaught TypeError: Cannot read property 'length' of undefined

Далее необходимо проверить newName.length и сравнить с fullNameMaxLength.

...