Можно ли создать «пустой» объект из интерфейса TypeScript? - PullRequest
1 голос
/ 08 мая 2020

Предположим, у вас есть очень большой объект, определенный как интерфейс TypeScript:

interface AccountInterface {
  accountIdentifier?: string;
  sid?: string;
  idToken?: {
    aio?: string;
  };
  idTokenClaims?: {
      aio?: string;
  };
}

Я бы хотел, чтобы объект всегда имел свои свойства и вспомогательные свойства. Они могут быть строкой или пустой строкой:

let account = {
  accountIdentifier: "",
  sid: "",
  idToken: {
    aio: "",
  },
  idTokenClaims: {
    aio: "",
  },
};

Читая другие вопросы, я подумал, что можно было бы сделать это:

const emptyAccount = {} as AccountInterface

console.log('emptyAccount ', emptyAccount)
console.log('emptyAccount.sid ', emptyAccount.sid)

Но это не создает объект со всеми свойствами как пустые строки по желанию. для объекта со свойствами пустой строки.

Ответы [ 2 ]

4 голосов
/ 08 мая 2020

Вы можете создать class, который реализует это interface, добавив значения по умолчанию, и использовать их для создания ваших объектов. Вы по-прежнему переписываете ту же структуру в другом месте, но теперь вам нужно сделать это только один раз, и вы можете использовать constructor для инициализации вашего объекта с другими значениями, если хотите.

interface AccountInterface {
  accountIdentifier?: string;
  sid?: string;
  idToken?: {
      aio?: string;
  };
  idTokenClaims?: {
      aio?: string;
  };
}

class Account implements AccountInterface {
  accountIdentifier = '';
  sid = '';
  idToken = { aio: '' };
  idTokenClaims = { aio: '' };
}

const emptyAccount = new Account();

Кроме того, как указано в @apokryfos, вы также можете использовать класс для ввода объектов, поэтому нет необходимости определять одновременно instance и class, если только вы не собираетесь иметь объекты, реализующие этот экземпляр, которые не были созданный с использованием класса (поскольку у них не было бы методов, определенных в классе).

Если вы хотите избежать использования class и использовать function для чего-то подобного, вы полностью можете:

function createAccount(): AccountInterface {
  return {
    accountIdentifier = '';
    sid = '';
    idToken = { aio: '' };
    idTokenClaims = { aio: '' };
  };
}

const emptyAccount = createAccount();
0 голосов
/ 08 мая 2020

const emptyAccount = {} as AccountInterface должен создать объект. Но ваш AccountInterface включает только те свойства, которые могут существовать, но не должны (из-за?). Таким образом, пустой объект полностью соответствует вашему AccountInterface.

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

interface AccountInterface {
    accountIdentifier: string|null // <- will be included in {} as AccountInterface
    sid?: string // <- will not be included in {} as AccountInterface
}
...