2017-08-22 4 views
0

エイリアスとして自動的に推測されないタイプをTypeScriptで定義することは可能ですか?私はあなたがそれを唱えない限りfoo("123")は、同様のエラーであることを期待するエイリアスに自動的に変換できないタイプを定義します

function foo(id: id) {} 

var s:string = "123"; 
foo(s); // error? 

:それは明示的に宣言された型として指定されていない場合

type id = string; 
type int = number; 

それから私はエラーを取得したいのですがfoo("123" as id)

+1

「強いエイリアス」と呼ばれています。 –

+0

Typescriptで「ブランディング」と呼ばれるものを使ってこの効果を得る方法があります。携帯電話以外のデバイスに接続する前に、他の人がそうしないと答えを追加します。(電話キーボードのコードを紛らわしく退屈にしています) – jcalz

答えて

1

活字体でこの動作を取得するための主な方法は"branding"は(もMicrosoft/Typescript#4895での議論を参照)と呼ばれる技術です。考え方は、ランタイム効果を持たないが、型システムがそれを基底型と区別させる "ブランド"で基底型を補強するというものです。あなたのケースでは

は、我々はこのような何かを行うことができ:あなたが見ることができるように

type id = string & { __brand: 'id' }; 
type int = number & { __brand: 'int' }; 

function foo(id: id) {} 

var s:string = "123"; 
foo(s); // error 
foo("123"); // error 
foo("123" as id) //okay 

が、それは多かれ少なかれ、あなたが望むとおりに動作します。あなたがこれを行うことができますので、それはまだ、ブランドの種類は、基本型と互換性があると考えていることに注意してください:

const i: int = 5 as int; 
const j: number = i; // that's okay, an int is a number 

この技術の主な欠点は、あなたが、基本的な型システムに嘘をついていることである:なしありstringまたはnumber__brandプロパティです。しかし、ブランディングがgood enough for the compiler itselfなら、それはおそらく十分です。

ブランディングやタグ付けを行う方法は他にもありますが、それはうまくいくはずです。がんばろう!

+0

@jcalzありがとう、これは私が探していたものです!ブランディングについてのコメントを残した後、私は[GitHub wiki](https://github.com/Microsoft/TypeScript/wiki/FAQ)のTypescript FAQを見つけました。このFAQには、他の宝石の中でも名義型のエイリアスに関するセクションが含まれていました.. 再度、感謝します! –

1

TSは構造的で公称的なタイピングを使用しているので、これは不可能だと考えてください。あなたはここでより多くの情報を見つけることができます。この機能が必要な場合

https://www.typescriptlang.org/docs/handbook/type-compatibility.html

の推測では、あなたが流れ型に切り替える必要があります。 https://flow.org/en/docs/types/opaque-types/

EDIT:彼らはこれを得た、これはTSのチームが計画したものである推測:Microsoft/TypeScript#5228

+0

おかげさまで読んでいただきありがとうございます。 TypeScriptに似ています。私はそれが持っている他のものをさらに見なければならないでしょう。 –

関連する問題