温馨提示:本文翻译自stackoverflow.com,查看原文请点击:typescript2.0 - How to fill properties of class TypeScript?
typescript typescript2.0

typescript2.0 - 如何填充TypeScript类的属性?

发布于 2020-03-31 23:27:03

假设有一个类似的模型类:

class Filter implements IFilterJournal {
  public category: number;
  public subject: number;
  public teacher: number;
  public mark: number;
}

我可以创建此类的实例:

let f = new Filter();

它返回Filter内部具有空属性的对象

如何填充类的属性更方便?

我可以像这样确定构造器:

public constructor(public category: number, public subject: number, public teacher: number, public mark: number){
}

然后在创建实例时传递参数:

let f = new Filter(1, 2, 3, 4)

但是,如果我只需要填写public subject: number;财产怎么办?还有其他吗?如何有选择地填充它们?

另一个是将参数设置为可选:

public constructor(public category?: number, public subject?: number, public teacher?: number, public mark?: number){}

然后像这样使用:

let f = new Filter(subject = 1);

查看更多

提问者
OPV
被浏览
10
Titian Cernicova-Dragomir 2018-05-29 20:24

如果可以使用属性的任何组合来初始化对象,则可以使用构造函数Partial<Filter>作为参数,并使用它Object.assign来设置对象上的字段。

class Filter  {
    constructor(data: Partial<Filter>){
        Object.assign(this, data);
    }
    public category: number;
    public subject: number;
    public teacher: number;
    public mark: number;
}
new Filter({ category: 0})
new Filter({ category: 1, subject: 2, teacher: 3, mark: 4})

注意 Partial是一种映射类型,它保留类型的成员,但将所有成员标记为Partial参见docs在这种情况下Partial<Filter>等效于:

interface PartialFilter{
    category?: number;
    subject?: number;
    teacher?: number;
    mark?: number;
}

如果您的类型具有方法,则Partial允许构造函数的参数包含这些方法,这可能是一个问题。您可以使用条件类型从参数中筛选出方法,但这有点复杂:

type NotFunctions<T> = { [P in keyof T]: T[P]  extends Function ? never : P }[keyof T];
class Filter  {
    constructor(data: Partial<Pick<Filter, NotFunctions<Filter>>>){
        Object.assign(this, data);
    }
    public category: number;
    public subject: number;
    public teacher: number;
    public mark: number;

    public sayHi(){ return "Hi" }
}
new Filter({ category: 0, sayHi: ()=> {}}) //Error with new constructor argument type 
new Filter({ category: 0})
new Filter({ category: 1, subject: 2, teacher: 3, mark: 4})