将类型分配给类的打字稿成员的正确方法是什么

时间:2020-10-05 07:41:59

标签: typescript

这是我的代码

interface IClassMasks {
  arrMasksMultiple: string[];
  arrMasksSingle: string[];
  strMarker: string;
  strMarkerMaskName: string;
}

class ClassMasks implements IClassMasks {
  public arrMasksMultiple;
  public arrMasksSingle;
  public strMarker;
  public strMarkerMaskName;
  constructor() {
    this.arrMasksMultiple = [];
    this.arrMasksSingle = [];
    this.strMarker = null;
    this.strMarkerMaskName = 'strMarkerMask';
  }
}

当我将鼠标悬停在编辑器中的arrMasksMultiple上时,它说-

成员“ arrMasksMultiple”隐式具有“ any”类型,但可以根据使用情况推断出更好的类型

因此,如果成员说-'any'类型,则它不能利用上面的界面。

1 个答案:

答案 0 :(得分:1)

您仍然需要声明类内部字段的类型;这些类型还必须与您要实现的接口兼容。默认情况下,类型被隐式假定为any,与IClassMasks中定义的类型不兼容。

此外,您无法将null分配给IClassMasks.strMarker,因为未指定类型也可以是null

以下是修改后的输入内容:

interface IClassMasks {
    arrMasksMultiple: string[];
    arrMasksSingle: string[];
    strMarker: string | null;  // indicate that this can also be a null value
    strMarkerMaskName: string;
}

class ClassMasks implements IClassMasks {
    // explicitly declare the types of these fields that are compatible with the IClassMasks interface
    public arrMasksMultiple: string[];
    public arrMasksSingle: string[];
    public strMarker: string | null; // indicate that this can also be a null value
    public strMarkerMaskName: string;
    constructor() {
        this.arrMasksMultiple = [];
        this.arrMasksSingle = [];
        this.strMarker = null;
        this.strMarkerMaskName = 'strMarkerMask';
    }
}

为简便起见,您还可以分配默认值,而不是在构造函数中分配默认值。这是一个示例,其中前三个字段具有默认值。

class ClassMasks implements IClassMasks {
    public arrMasksMultiple: string[] = [];
    public arrMasksSingle: string[] = [];
    public strMarker: string | null = null;
    public strMarkerMaskName: string;
    constructor() {
        this.strMarkerMaskName = 'strMarkerMask';
    }
}