最近在學(xué)習(xí)使用Ionic2,在使用ngrx(https://github.com/ngrx/store) 時(shí)员帮,想把所有的ActionType放到一個(gè)文件中定義或粮,我是做JAVA的自然是想到JAVA中經(jīng)常使用到的常量類。想著也要用TypeScript實(shí)現(xiàn)一個(gè)捞高。
按照J(rèn)AVA的套路氯材,直接以下代碼就輕松搞定了
interface ActionType{
String ADD_TASK = "ADD_TASK";
}
但是在TypeScript中似乎是行不通的,首先interface沒(méi)有初始化硝岗,不能夠直接賦值氢哮;其次使用class,對(duì)屬性使用const肯定是不行型檀,使用 readonly 可以實(shí)現(xiàn)屬性只讀冗尤,但是class又有還需要new 才能用。
理一下,目前的現(xiàn)狀裂七,我想要實(shí)現(xiàn)的功能是使用ActionType.ADD_TASK 就能使用常量字符串"ADD_TASK"皆看。而TypeScript 中使用的都是對(duì)象,也就是說(shuō)我不能通過(guò)類型來(lái)獲取數(shù)據(jù)背零,只能通過(guò)對(duì)象腰吟。通過(guò)導(dǎo)入import { ActionType } from '../..' 得到的應(yīng)該是一個(gè)對(duì)象,且這個(gè)對(duì)象只有一個(gè)不能夠修改徙瓶。那么在我的ActionType定義文件中 就只能通過(guò)下面這種方式來(lái)暴露ActionType
export const ActionType = {};
首先得保證ActionType 是一個(gè)不可修改的對(duì)象毛雇,就使用const將其設(shè)置為常量。然后需要構(gòu)造一個(gè)對(duì)象侦镇,這個(gè)對(duì)象就是用來(lái)存儲(chǔ)我們需要的ActionName灵疮,自然這些屬性必須是只讀的了。因此壳繁,可以事先定義好一個(gè)接口始藕,接口的屬性必須是只讀的,然后在構(gòu)造對(duì)象的時(shí)候就可以指定值氮趋,且不可修改了伍派。
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'}
}
可能你會(huì)覺(jué)得,一個(gè)堆常量而已剩胁,直接用 export const XXX='XXX'就好了诉植,干嘛非得這么費(fèi)事。其實(shí)也沒(méi)什么昵观,想要個(gè)面向?qū)ο罅狼唬缓骾mport的時(shí)候只用一句話就好。