?系列文章目录?
定义Model时,需要正确地定义props中各字段的类型。本文将对MST提供的各种类型以及类型的工厂方法进行简单的介绍,方便同学们在定义props时挑选正确的类型。
前提
定义props之前,有一个前提是,你已经明确地知道这个Model中状态的数据类型。
如果Model用于存放由后端API返回的数据,那么一定要和后端确认返回值在所有情况下的类型。比如,某个字段在没有值的时候你以为会给一个''
,而后端却给了个null
;或者某个数组你以为会给你一个空数组[]
,他又甩你一个null
。如果你不打算自己编写一个标准化数据的方法,那一定要和数据的提供方确定这些细节。
基础类型
types.string
定义一个字符串类型字段。
types.number
定义一个数值类型字段。
types.boolean
定义一个布尔类型字段。
types.integer
定义一个整数类型字段。
注意,即使是TypeScript中也没有“整数”这个类型,在编码时,传入一个带小数的值TypeScript也无法发现其中的类型错误。如无必要,请使用types.number
。
types.Date
定义一个日期类型字段。
这个类型存储的值是标准的Date对象。在设置值时,可以选择传入数值类型的时间戳或者Date对象。
export const Model = types
.model({
date: types.Date
})
.actions(self => ({
setDate (val: Date | number) {
self.date = date;
}
}));
复制代码
types.null
定义一个值为null
的类型字段。
types.undefined
定义一个值为undefined
的类型字段。
复合类型
types.model
定义一个对象类型的字段。
types.array
定义一个数组类型的字段。
types.array(types.string);
复制代码
上面的代码定义了一个字符串数组的类型。
types.map
定义一个map类型的字段。该map的key都为字符串类型,map的值都为指定类型。
types.map(types.number);
复制代码
可选类型,types.optional
根据传入的参数,定义一个带有默认值的可选类型。
types.optional
是一个方法,方法有两个参数,第一个参数是数据的真实类型,第二个参数是数据的默认值。
types.optional(types.number, 1);
复制代码
上面的代码定义了一个默认值为1的数值类型。
注意,types.array
或者types.map
定义的类型自带默认值(array为[]
,map为{}
),也就是说,下面两种定义的结果是一样的:
// 使用types.optional
types.optional(types.array(types.number), []);
types.optional(types.map(types.number), {});
// 不使用types.optional
types.array(types.number);
types.map(types.number);
复制代码
如果要设置的默认值与types.array
或types.map
自带的默认值相同,那么就不需要使用types.optional
。