【问题标题】:How to assign values to defined interface?如何为定义的接口赋值?
【发布时间】:2018-09-24 18:20:22
【问题描述】:

我已经为我试图为客户端构建的响应定义了接口我看到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;
}

【问题讨论】:

  • “即将到来未定义”是什么意思? undefined 是什么?在哪里?
  • 在分配值后,它应该具有所有被映射的属性,但其打印 specialtyResponse undefined
  • 我不明白你的问题,但一般values cannot be assigned to interfaces in typescript
  • @messerbill 好的,如果我有响应和构建对象的接口,那么正确的方法是什么

标签: typescript interface


【解决方案1】:

在您的示例中,您创建了一个空对象:

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";

Try it on TypeScript Playground


更新

specialtyResponse 可能是错字。你的意思是specialityResponse吗?

【讨论】:

    【解决方案2】:

    你宁愿定义一个类而不是一个接口:

    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)
    

    这也有效,但除非有充分的理由,否则不应这样做

    const balance: IGetAccountBalanceResponse = {} as any;
    

    接口不应用于实例化对象,而应用于定义其类型。

    如果您使用诸如 eslint 之类的 linter(我强烈建议您这样做),您会在编译之前看到错误弹出。

    您可以在这里试用: http://www.typescriptlang.org/play/

    Here are the official docs on it

    Here is a working example

    【讨论】:

    • main.ts(82,15): error TS2322: Type '{}' is not assignable to type 'IGetAccountBalanceResponse'. Property 'header' is missing in type '{}'. 尝试您的方法得到此错误
    • @hussain 好的,所以最后一点不对,我更新了答案。但是,您应该始终使用const x = new Foo() 来创建某种类型的对象。
    • const specialtyResponse = new IGetAccountBalanceResponse(data) 标头和详细信息正在获取未定义的对象
    • 你上过课吗?
    • @hussain 我在 stackblitz 中添加了一个工作示例,检查一下
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 2021-12-08
    相关资源
    最近更新 更多