Как бороться с ошибками ТС относительно обязательных полей, которые только будут заполнены? - PullRequest
3 голосов
/ 08 апреля 2020

Довольно стандартным вариантом использования будет создание пустого объекта и заполнение его необходимыми данными. В конце процесса заполнения объект будет содержать все необходимые свойства, но когда он создается, он не имеет ни одного, и поэтому TypeScript не позволит мне набрать этот новый объект с правильным типом.

Пример:

interface ISomeType {
  x: string;
  y: string;
}

function buildObj(): ISomeType {
  const obj: ISomeType = {}; // TS Error: {} doesn't include x and y
  obj.x = foo();
  obj.y = bar(); // At the end of the filling process, the object is correct

  return obj;
}

Как мне решить эту проблему? Как мне заставить TypeScript понять, что этот новый объект должен быть указанного типа, у него просто еще нет необходимых свойств, и они будут в конце?

Если я отмечу obj типом Partial<ISomeType>, тогда я не могу пометить тип возвращаемого значения функции ISomeType, что является моим намерением.

Ответы [ 4 ]

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

Сначала я сконструировал бы детали и просто возвратил бы литерал объекта:

function buildObj(): ISomeType {
    const x = foo(); // const x: ISomeType['x'] = foo();
    const y = bar();
    return {
        x,
        y
    };
}

Нет причин создавать объект перед его возвратом.

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

Вы также можете заполнить объект с самого начала значениями полей

function buildObj(): ISomeType {
 const obj: ISomeType = {
   obj.x = foo();
   obj.y = bar();
 }

 return obj;
}

Вы должны быть в состоянии собрать всю необходимую вам информацию перед созданием объекта и затем создать его. Это обеспечит безопасность типов.

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

НЕ ДОЛЖЕН

Тип Утверждение . Даже если это позволит вам обойти ошибку. Это вызовет у вас много проблем в долгосрочной перспективе. Потому что он практически говорит, что этот объект является допустимым объектом данного конкретного типа, тогда как его нет.

<ISomeType>{}

DO

Типы утилит, Они позволят вам изменить исходный объект в соответствии с вашими потребностями.

Частичный

Создает тип со всеми свойствами T, установленными в необязательные. Эта утилита вернет тип, который представляет все подмножества данного типа.

interface ISomeType {
  x: string;
  y: string;
}

const someType:Partial<ISomeType> = {};

// Behind the scene it does following:
interface ISomeType {
  x?: string;
  y?: string;
}

Pick

Создает тип путем выбора набора свойств K от T

const someType:Pick<ISomeType, 'x'> = {
  x: 0
};

Кроме того. Я бы порекомендовал вам просмотреть Руководство по кодированию TypeScript . В интерфейсах TypesScript не должно быть префикса I, как в C#.

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

Попробуйте это:

function buildObj(): ISomeType {
  const obj: Partial<ISomeType> = {}; // TS Error: {} doesn't include x and y
  obj.x = foo();
  obj.y = bar(); // At the end of the filling process, the object is correct

  return obj as ISomeType;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...