2017-03-29 7 views
1

Flow(または好奇心から抜けたタイプ)を使用して、特定の関数から生じることができるタイプを作成できますか?私は "SanitizedString"のようなものとしてサニタイズされた文字列を入力できるようにしたい。しかし、私が単にtype SanitizedString = stringのエイリアスを付けた場合、そのタイプに消毒されていない文字列を割り当てることができます。フロー - 関数からしか得られないタイプ

代わりに、それは私のsanitizeHtml()関数からの戻り値から来るように入力したいと思います。どちらのタイプのシステムでもこれが可能かどうかは誰にも分かりますか?

ありがとうございます!

答えて

2

Typescriptでは、交差点タイプと「タグ付け」インターフェースを使用することができます。

interface Sanitized { 
    isSanitized: never; 
} 

type SanitizedType<T> = T & Sanitized; 

function sanitizeString(str: string): SanitizedType<string> { 
    return str as SanitizedType<string>; 
} 

function printSanitizedString(sstr: SanitizedType<string>): void { 
    console.log(sstr); 
} 

printSanitizedString("Hello, world!"); // ERR 
printSanitizedString(sanitizeString("Hello, world!")); // OK 

我々は実際に(私たちはタイピングのためにそれをしたい)何のためisSanitizedの値を必要としないように、我々は我々がそれを使用しようとした場合、我々はエラーが出るのでneverとしてそれがあるタイプ。交差型であるため、通常の文字列が使用可能な場合はいつでもsanitizeString(str)の戻り値を使用できます。

+0

これはちょっとハッキリしているように見えますが、意図が透過的ではないようですが、仕事が完璧に行われます。お見事! –

+0

うん。実際のコードでは、代わりに 'sanitizedString = {value:string}'のように、あなたのサニタイズ関数が返すラップされたオブジェクトを置くべきでしょう。それはあなたがそれを使用するときにアンラップする必要があることを意味しますが、それは意図をはるかに良く表しています。 – y2bd

関連する問題