【发布时间】:2017-01-02 10:50:45
【问题描述】:
我正在尝试迁移现有代码库以使用 Flow。由于这个项目是在没有 Flow 的情况下开始的,所以我对枚举等使用了一个非常典型的 JS 模式。
这里有几个我想要的定义
export const LOAN_STATUS = {
PENDING: 'pending',
CURRENT: 'current',
DUE: 'due',
OVERDUE: 'overdue',
PENDING_PAYMENT: 'pending_payment',
CHARGED_OFF: 'charged_off',
VOIDED: 'voided',
DISPUTED: 'disputed',
REFUNDED: 'refunded',
SETTLED: 'settled',
}
export const ACTIVE_LOAN_STATUS = [
LOAN_STATUS.OVERDUE,
LOAN_STATUS.CURRENT,
LOAN_STATUS.DUE,
LOAN_STATUS.PENDING_PAYMENT,
]
Flow 工作正常,直到我导入此文件并且它说我需要添加类型注释。这似乎很奇怪——为什么我必须注释完全静态且易于推断的对象?
有没有什么方法可以将其类型定义为“静态”或“文字”?
然后我开始思考如何为此添加注释。我的第一个想法就是{[key: string]: string} 和Array<string>。 Flow 有效,但我意识到这些类型定义完全没有价值。所以我尝试了另一种方法:
type LoanStatusValues =
'pending' |
'current' |
'due' |
'overdue' |
'pending_payment' |
'charged_off' |
'voided' |
'disputed' |
'refunded' |
'settled'
type LoanStatusKeys =
'PENDING' |
'CURRENT' |
'DUE' |
'OVERDUE' |
'PENDING_PAYMENT' |
'CHARGED_OFF' |
'VOIDED' |
'DISPUTED' |
'REFUNDED' |
'SETTLED'
type ActiveLoanStatus =
"current" |
"due" |
"overdue" |
"pending_payment"
我使用类型注释{[key: LoanStatusKeys]: LoanStatusValues} 和Array<ActiveLoanStatus>。但即使是这些注释也失去了这是静态的事实!
我不得不编写这么多重复的代码似乎很奇怪。然后,如果我只想转换为 Flow,我实际上无法使用 JS 中的类型。例如我可能会这样做:
if (defs.ACTIVE_LOAN_STATUS.indexOf(loan.status) !== -1) {
}
现在如果我想使用 Flow 类型,我不能这样做:
type ActiveLoanStatus =
"current" |
"due" |
"overdue" |
"pending_payment"
if (loan.status isTypeOf ActiveLoanStatus) {
}
那么我应该如何使用这些静态枚举呢?我一定是做错了!
【问题讨论】:
-
相关Github问题:github.com/facebook/flow/issues/627
标签: javascript enums flowtype