Как объявить типы для необязательных полей в объектах области в typescript?

#reactjs #typescript #react-native #realm

Вопрос:

Допустим, у меня есть следующее определение в схеме:

 export const ItemSchema = {
  name: 'item',
  properties: {
    _id: 'objectId',
    sku: 'string?',
    name: 'string',
    updateDatetime: 'date',
    creationDatetime: 'date',
  },
  primaryKey: '_id',
};
 

В этом случае поле артикул является необязательным. Как я должен объявить поле в интерфейсе с помощью typescript?

Сейчас у меня есть три варианта.

Наличие артикула, подлежащего аннулированию:

 export interface Item  {
  _id: ObjectId;
  sku: string | null;
  name: string;
  updateDatetime: Date;
  creationDatetime: Date;
}
 

Наличие артикула в качестве опции:

 export interface Item  {
  _id: ObjectId;
  sku?: string;
  name: string;
  updateDatetime: Date;
  creationDatetime: Date;
}
 

Наличие артикула в качестве необязательного и обнуляемого:

 export interface Item  {
  _id: ObjectId;
  sku?: string | null;
  name: string;
  updateDatetime: Date;
  creationDatetime: Date;
}
 

С моей стороны, любой способ сделать это в основном одинаков, но то, что я всегда повышаю значения, не означает одно и то же. Для этого кода:

   realm.write(() => {
    realm.create<Item>('item', item, UpdateMode.Modified)
}
 
  1. Если артикул не определен (значение или поле не существует в элементе), значение не будет обновляться.
  2. Если артикул равен null, то значение будет равно null.

Итак, каким должен быть правильный способ объявления типа для обработки в моем приложении?

Ответ №1:

  1. Если артикул не определен (значение или поле не существует в элементе), значение не будет обновляться.
  2. Если артикул равен null, то значение будет равно null.

Чтобы эта функциональность работала , вам нужно, чтобы поле могло быть как undefined «или null «, так и «как string «.

Так что эти двое не сработают:

 { sku: string | null } // can't be undefined
{ sku?: string } // can't be null
 

Это означает, что вам нужна эта форма:

 { sku?: string | null; }
 

? Говорит, что его можно опустить (в этом случае это так undefined ), и | null говорит, что он может быть явно установлен в значение null.

Это единственный тип, который поддерживает все следующие:

 {} // ignore sku
{ sku: undefined } // ignore sku
{ sku: null } // write null to sku
{ sku: 'abc123' } // write string to sku