如何从TypeScript中的字符串常量创建类似联合或枚举的行为?

时间:2019-06-13 14:32:51

标签: typescript

我目前有一个保存颜色值的常量列表:

const gray = "#555"
const grayLight = "#777"
const primary1 = "#fff"
const primary2 = "#000"

我还有一个函数,该函数接收要为其创建接口的对象形式的参数。参数之一应该是这些颜色的子集。

以下是使用联合类型的外观示例。

interface props {
  argument1: string
  colorChoices: '#555' | '#777'
}
function myFunction(props: props): void {
  //...
}

我知道枚举和联合类型不接受按设计计算的(字符串)值。因此以下操作无效:

const gray = "#555"
const grayLight = "#777"
enum colors {
  gray = gray,
  grayLight = grayLight,
}
type grays = gray | grayLight

我可以举一个下面的例子,它可以使它安全并且可以正常工作,但是恒定重复似乎不是一个明智的模式。

type gray = '#555'
const gray: gray = '#555'
type grayLight = '#777'
const grayLight: grayLight = '#777'
type grayScale = gray | grayLight

interface props {
  argument1: string
  colorChoices: grayScale
}
function myFunction(props: props): void {
  //...
}

有没有一种方法可以做到这一点而又不重复我的常数值并将这些值仅放在一个位置?

1 个答案:

答案 0 :(得分:3)

您可以在常量上使用with x as ( SELECT DISTINCT PI.INDEX_VALUE, LB.STATE, UNIQUE_ID, 'AL', 'EN', MBP.START_DATE, ADD_MONTHS(MBP.START_DATE,12) as m1, CASE WHEN MBP.CLOSURE_ID = 40 THEN MBP.END_DATE - 120 WHEN MBP.CLOSURE_ID IN (5,18,103) THEN MBP.END_DATE - 365 ELSE MBP.END_DATE - 270 END AS END_DATE1 FROM dwteam.PATIENT_DETAILS PD JOIN dwteam.ADMIN_CLIENT AC ON AC.CLIENT_ID = PD.CLIENT_ID AND AC.DELETED_BY is null JOIN dwteam.MEM_BENF_PROG MBP ON MBP.MEMBER_ID = PD.PATIENT_ID AND MBP.DELETED_BY is null JOIN dwteam.BENF_PLAN_PROG BPP ON BPP.BEN_PLAN_PROG_ID = MBP.BEN_PLAN_PROG_ID JOIN dwteam.BENEFIT_PROGRAM BPR ON BPR.BENEFIT_PROGRAM_ID = BPP.BENEFIT_PROGRAM_ID AND BPR.DELETED_BY is null left JOIN dwteam.PATIENT_INDEX PI ON PI.PATIENT_ID=MBP.MEMBER_ID AND PI.INDEX_ID in (10073,10071) left join UHG_000613129.HFS_LOB_ID_XWALK LB on trim(upper(replace(replace(AC.CLIENT_NAME,'C&S',''),'M&R',''))) = trim(upper(STATE_DESC)) WHERE PROGRAM_NAME IN ('Healthy Pregnancy','High Risk Pregnancy') AND (sysdate < ADD_MONTHS(MBP.START_DATE,12) OR sysdate < ADD_MONTHS(MBP.END_DATE,12)) ) SELECT * FROM x WHERE end_date1 > ... -- filtering predicate(s) using a named expression 来获取常量的实际类型,因此无需为每个常量定义类型:

typeof