假设有一个类似的模型类:
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);
如果可以使用属性的任何组合来初始化对象,则可以使用构造函数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})
是什么
Partial
?就我而言是interface IFilter {}
类型@OPV解释了部分。
谢谢,很好!