2017-02-13 44 views
11

说我有以下字符串常量:流类型的常量字符串,并依赖类型

export default const FOO = 'FOO'

说我导入此在流动注释文件,像这样:

import FOO from '../consts/Foo'

然后我有一个功能:

const example = (foo : string) : {| type: FOO, foo: string |} => { 
    return {type: FOO, foo: foo} 
} 

这不会进行类型检查:

6: const example = (foo : string) : {| type: FOO, foo: string |}=> { 
                 ^^^^^^^^^^^^^^ string. Ineligible value used in/as type annotation (did you forget 'typeof'?) 
    6: const example = (foo : string) : {| type: FOO, foo: string |}=> { 
                 ^^^^^^^^^^^^^^ FOO 

所以我的问题是:

1)是否有可能使用流类型的常量,我怎么能重现此问题?

2)是否可以在流程中执行依赖类型?例如,我是否可以通过类型编码,返回的字符串必须是传递给example函数的相同字符串?

编辑:澄清的第2部分:是否有可能以某种方式表明传递到example功能foo参数其实是相同的字符串作为在返回对象的foo钥匙串?或者断言输入和输出具有相同的长度(例如换位密码功能)。或者说包含相同字符的排列? (用于洗牌)。

https://en.wikipedia.org/wiki/Dependent_type

+0

如果你想'FOO'有类型''FOO''那么你需要声明它,否则它只是一个字符串。对于这些对象,你可以像输入错误那样输入:typeof FOO。虽然我不太清楚你在问你的问题。那么你最终会得到一个具有两个相同字符串值的属性的对象。 – loganfsmyth

回答

5

,而不用声明FOO作为const的,只有一个分支宣称它作为一个不交:

type FOO = "FOO" 

那么你的代码可以更新这样的:

const example = (foo : string) : {| type: FOO, foo: string |} => { 
    return {type: "FOO", foo: foo} 
} 

如果您使用除确切字符串文字"FOO"之外的任何值,其中FOO是必需的,那么这是一个编译错误。

如果您希望保持常量,那么您需要以不同的方式命名该类型,因为它们会发生碰撞。所以,你可以这样做:

const FOO = "FOO" 
type FooType = "FOO"; 

const example = (foo : string) : {| type: FooType, foo: string |} => { 
    return {type: FOO, foo: foo} 
} 

不幸的是,我看不到的方式,以避免重复的字符串字面量,因为类型不相交并定义语法只允许文字和类型,即使他们是常数不变量。

+0

为Flux标准动作模式定义动作类型为字符串以清除代码中的一些引用标记,这是一个非常有趣的模式。这样,如果我错了,纠正我,我可以定义一个元类型'ValidResponses = FOO | BAR;'并确保API函数调用返回正确的响应,而不仅仅是正确的数据类型。 – ermik