2016-11-12 11 views
3

UUIDを処理するコードを記述しているとします。内部的には、それらを文字列として表現したいと思います。つまり、すべてのUUIDは文字列ですが、すべての文字列が有効なUUIDであるというわけではありません。誤ってUUIDを保持する変数に間違ったものを割り当てることは望ましくありません。これらの性質を有するフローを持つタイプを作成する方法はありフローの組み込み型のサブタイプ

function create_uuid(): uuid; { /* implementation? */ } 
let foo: uuid = create_uuid(); 
let bar: string = uuid; // this is fine 

:だから私はこの割り当てが失敗するようなタイプ「UUID」を作成したい:

let foo: uuid = "Some string" 

しかし、これは成功するはず?私は私の研究で$Subtypeを発見し、これはうまくいくかもしれないと思った:

type uuid = $Subtype<string>; 

しかし、それはまだ文字列から割り当てることができますいくつかの理由があります。

+0

AFAIKでは、フローでは文字列の特定のサブタイプを定義できません。例えば"Some String"と "uuid chars"を区別することはできません。それらは文字列の同等のサブタイプです。 –

答えて

5

以下のハックがあります(欠点はUUIDObjectになるということです):

// keep this constructor private 
class IsUUID {} 

export type UUID = string & IsUUID; 

export function create(): UUID { 
    const uuid = 'blah' // <= your implementation 
    return ((uuid: any): UUID) 
} 

// tests 

declare function f(uuid: UUID): void; 
declare function g(s: string): void; 
declare function h(o: Object): void; 

let foo = create() 
let bar: string = foo // <= ok 
f(foo) // <= ok 
f(bar) // <= error: string. This type is incompatible with IsUUID 
g(foo) // <= ok 
g(bar) // <= ok 
h(foo) // <= ok :(
+1

私はいくつかのケースで別の解決策を追加したいだけです: 'export class UUID extends String {}'。 Stringオブジェクトは文字列とまったく同じではありませんが、他の多くの点で文字列のように機能します。たとえば、JSON.Stringify()はオブジェクトではなく文字列として文字列化します。 – Josh

3

あり、この問題を解決することができますいくつかのハックかもしれませんが、あなたはとして知られているを求めていますopaque data typeであり、現在のところFlowはそれらをサポートしていません。ここには、GitHubのFlowリポジトリにあるsomediscussionsがあります。

関連する問題