2017-02-13 101 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