最近在学习使用Ionic2,在使用ngrx(https://github.com/ngrx/store) 时,想把所有的ActionType放到一个文件中定义,我是做JAVA的自然是想到JAVA中经常使用到的常量类。想着也要用TypeScript实现一个。
按照JAVA的套路,直接以下代码就轻松搞定了
interface ActionType{
String ADD_TASK = "ADD_TASK";
}
但是在TypeScript中似乎是行不通的,首先interface没有初始化,不能够直接赋值;其次使用class,对属性使用const肯定是不行,使用 readonly 可以实现属性只读,但是class又有还需要new 才能用。
理一下,目前的现状,我想要实现的功能是使用ActionType.ADD_TASK 就能使用常量字符串"ADD_TASK"。而TypeScript 中使用的都是对象,也就是说我不能通过类型来获取数据,只能通过对象。通过导入import { ActionType } from '../..' 得到的应该是一个对象,且这个对象只有一个不能够修改。那么在我的ActionType定义文件中 就只能通过下面这种方式来暴露ActionType
export const ActionType = {};
首先得保证ActionType 是一个不可修改的对象,就使用const将其设置为常量。然后需要构造一个对象,这个对象就是用来存储我们需要的ActionName,自然这些属性必须是只读的了。因此,可以事先定义好一个接口,接口的属性必须是只读的,然后在构造对象的时候就可以指定值,且不可修改了。
interface TaskActionTypeInterFace{
readonly ADD_TASK : string ;
readonly VIEW_TASK : string ;
}
interface PlanActionTypeInterFace{
readonly ADD_PLAN : string ;
readonly VIEW_PLAN : string ;
}
interface ActionTypeInterFace {
readonly TASK : TaskActionTypeInterFace ;
readonly PLAN : PlanActionTypeInterFace ;
}
/**
* Action 常量定义
*/
export const ActionType : ActionTypeInterFace = {
TASK : { ADD_TASK : 'ADD_TASK', VIEW_TASK : 'VIEW_TASK'},
PLAN : { ADD_PLAN : 'ADD_PLAN', VIEW_PLAN : 'VIEW_PLAN'}
}
可能你会觉得,一个堆常量而已,直接用 export const XXX='XXX'就好了,干嘛非得这么费事。其实也没什么,想要个面向对象,然后import的时候只用一句话就好。