Как назначить значения для определенного интерфейса? - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть интерфейс, определенный для ответа, который я пытаюсь построить для клиента, я вижу, что data имеет ответ от бэкэнда, поэтому теперь я пытаюсь присвоить значения моему объекту интерфейса, он становится неопределенным.Не знаете, почему возникла эта проблема?

main.ts

  private async specialtyAccountBalanceResponse(@Body()data: IAccountBalanceSdkResult): Promise<any> {
      const saveDetails = {} as ICacheRequest;
      const specialtyResponse = {} as IGetAccountBalanceResponse;

      if (!data.Details && data.Header.StatusCode !== "0000") {
          return data.Header;
      }
      specialtyResponse.details.lineOfBusiness = "SPec";
      specialtyResponse.details.balanceAccount = data.Details.balanceAccount;
      return specialtyResponse;
  }

interface.ts

export interface IGetAccountBalanceResponse {
    header: any;
    details: IGetAccountBalanceDetails;
}

export interface IGetAccountBalanceDetails {
    lineOfBusiness: string;
    balanceAccount: string;
    payment: IPaymentIndicator;
}

export interface IPaymentIndicator {
    recentPaymentIndicator: string;
    recentPaymentAmount: string;
    achAuthRequiredInd: string;
}

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

В вашем примере вы создаете пустой объект:

const specialtyResponse = {} as IGetAccountBalanceResponse;

Затем вы пытаетесь получить доступ к его свойству:

specialtyResponse.details.lineOfBusiness = "SPec";

details никогда не создается, поэтомуundefined.Поэтому вы не можете получить доступ к его свойству lineOfBusiness.

. Одним из решений будет использование классов, предложенных @undefinedMayNotBeNull.Другой вариант - просто установить specialtyResponse.details перед доступом к свойствам.

specialtyResponse.details = {} as IGetAccountBalanceDetails;

Вот рабочий пример:

interface IGetAccountBalanceResponse {
    details: IGetAccountBalanceDetails;
}

interface IGetAccountBalanceDetails {
    lineOfBusiness: string;
    balanceAccount: string;
}

const specialtyResponse = {} as IGetAccountBalanceResponse;
specialtyResponse.details = {} as IGetAccountBalanceDetails;

specialtyResponse.details.lineOfBusiness = "SPec";
specialtyResponse.details.balanceAccount = "Test";

Попробуйте его на TypeScript Playground


Обновление

specialtyResponse может быть опечаткой.Вы имеете в виду specialityResponse вместо этого?

0 голосов
/ 24 сентября 2018

Вы бы предпочли определить класс, а не интерфейс:

export class IGetAccountBalanceResponse {

    constructor(props?) {
       this.header = props.header;
       this.details = props.details;
    }

    public header: any;
    public details: IGetAccountBalanceDetails; 
}

, затем вы можете создать его экземпляр следующим образом:

const balance = new IGetAccountBalanceResponse()

или

const balance = new IGetAccountBalanceResponse(data)

Thisтакже работает, но не следует делать, если нет веской причины

const balance: IGetAccountBalanceResponse = {} as any;

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

Если вы используете линтер, такой как eslint (и я настоятельно рекомендую это сделать), вы увидите сообщение об ошибке перед компиляцией.

Здесь вы можете попробовать: http://www.typescriptlang.org/play/

Вот официальные документы по нему

Вот рабочий пример

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