角度8中的可重用类型(接口)

问题描述 投票:0回答:1

我正在尝试创建可用于同一类型对象的可重用接口。像UserDetails一样,在clarification.d.ts

declare module DataModel {
    interface UserDetails {
        userName: string;
        userId: number;
    }
}

所以我试图创建一个名称为DataModel的模块,它将具有多个对象类型。

在我的组件中,我创建了新变量,

public userDetails: DataModel.UserDetails;

注意:我已经导入了DataModel。

在ngOnInit()中,我试图为userDetails设置值,

 ngOnInit() {
    this.userDetails.userName = "Guest";
  }

但是当代码运行时,我遇到了错误,

无法在变量userDetails上设置未定义的属性'userName'。

我也尝试在tsconfig.json中以类型数组添加'declaration.d.ts'文件,但它不起作用。

任何解决方法都值得赞赏。

angular6 angular7 angular8 typescript-typings
1个回答
0
投票

该声明也很好,但是您忘了初始化变量,因此在使用时为undefined

我建议将其初始化为null,然后将其检查为分配:

public userDetails: DataModel.UserDetails = null;


ngOnInit() {
   this.userDetails = {
       userName: 'Guest',
       userId: 0,
   };
}

请注意,您必须提供userId,否则打字稿会告诉您在进行分配时未定义userId

如果您不想指定userId,则将您的接口声明为:

declare module DataModel {
    interface UserDetails {
        userName: string;
        userId?: number;
    }
}

或将您的属性输入为:

public userDetails: Partial<DataModel.UserDetails>;

这将允许UserDetails的每个键都是可选的


替代

您可以像这样初始化数据:

public userDetails: DataModel.UserDetails = {
   userName: null,
   userId: 0,
};

然后将其用作:

ngOnInit() {
   this.userDetails.userName = 'Guest';
}
© www.soinside.com 2019 - 2024. All rights reserved.