2017-07-12 12 views
0

タイプIの状態に対してある種の検査された表現が必要です。 constのように(右辺がその型でない場合はクラッシュしますが)一時的な変数はありません - 好ましくはインラインで、「型アサーション」(型キャスト)は現在どのように動作しているのでしょうか。コンパイラに値の型を知らせ、それをチェックする方法を簡潔にする方法は?

Edit1:これは明らかに実際のコードではありません。厳密には、私が書いた位置でタイプチェックを強制することです。機能を変更しないでください。固定してください。私は関数/ vars/lets/consts/interfacesで型を使う方法を知っていますが、それはこの問題に関するものではありません。

EDIT2:もう一つの例:

const input: any = 'SomeRealValueB'; // this comes from unsafe place, can't be safely typed without runtime checks which I really don't want to do 

//^that can't be changed 

type SomeRealType = 'SomeRealValueA' | 'SomeRealValueB'; 

// my current solution I am not happy with (unnecessary variable and line of code) 
const someRealValueA: SomeRealType = 'SomeRealValueA'; 
if(input == someRealValueA) { console.log('y'); } 
else { console.log('n'); } 

// why I want it typed - consider that after refactoring 'SomeRealValueB' gets changed to 'SomeRealValueC', I want compiler to chceck that for me 
+0

クラッシュを意味するのではなく、TypeScriptのコンパイルエラーです(同じものではありません)。また、あなたは 'use'関数であなたの制約を定義できないのでしょうか? –

+0

@ E_net4ああ、もちろん、コンパイルエラーだった。この例では、型の変更を妨げるものは何もありませんが、実際のコードでは何かがあります。機能を固定してください。 (更新された質問。) – monnef

答えて

0

現時点では、TypeScriptのインラインコンパイル時型チェックの構文はありません。私はあなたがすでに1を自分で作ることができるので、そのような機能ではそれほど関心がないこととします

function check<T>(x: T) { return x; } 

次の行を個別に失敗します:

check<number>("five"); 
use(check<Ty>('C')); 

をしかし、それを関数内の適切な型チェックの欠如は別の問題を隠す可能性があるため、ここでの関数は避けられないことに注意する必要があります。特に、外部関数useがパラメータとしてanyを受け取り、それ自身のセマンティクスではならない場合、それは不適切なTypeScript宣言であり、可能であれば再考して修正する必要があります。それ以外の場合、関数の宣言が変更される可能性がない場合や、パラメータ型の新しい制限がビジネスロジックの一部に過ぎない場合は、独自のアプリケーションを安全な型チェック関数にラップする必要があります。

あなたは今のところ3つの選択肢があります:(1)あなたの質問と同じように、変数を使用してください。意図制限のある新しい宣言を中心に機能をラップ(2):

type Ty = 'A' | 'B'; 
const useTy: (x: Ty) => void = use; 

useTy('C'); // Argument of type '"C"' is not assignable to parameter of type 'Ty'. 

(3)または最後に、機能以来、自身が型チェックをしている、あなたは上記のcheck関数のように恒等関数を作成し、それを使用することができます。

+0

私は#1について考えました(同じアプローチが以前私に起こりましたが、誰かがTSで直接サポートされているものを考え出すのを待っていました)。私はそれを使用します。あなたの他のポイントに - その関数は問題を表示するだけです。実際には '=='があり、片側が 'any'のときに型付けされません(ランタイムチェックをしない限り、 )ので、 '=='演算子に実際に型を追加することはできません。他の解決策は、ユニオン型を取り除き、新しい文字列列挙型に置き換えることです。残念なことに、文字列型に依存するいくつかのツールがあります:(ありがとうございます。 – monnef

0

私はこれをしたいと思う理由はわかりませんが、:

function use<T>(x: T){ 
    console.log(x); 
} 
type T = 'A' | 'B'; 
use<T>('C'); 

はギブ:

error TS2345: Argument of type '"C"' is not assignable to parameter of type 'T'. 

ベターは、おそらくになります'C'を使用するコンテキストが完全に入力されていることを確認してから、追加のchecを追加する必要はありませんks。

+0

それは私が求めているものではありません。私はそれをより明確にするために質問を編集しました。 – monnef

+0

悲しいことに、コンテキストは型なし( 'any')なので、実行時のチェックをしなくても、安全にその型を引き継ぐことはできません。誰かが 'T 'を変更したときのエラーを防ぐために(' '=' 'の演算子の場合は)右辺の値をタイプしたいと思います(例えば' T 'の定義で '' A''を '' Z''に変更する) ')、コンパイラはそれをキャッチしません。なぜなら、左辺は型なしなので右辺は何でもよいからです。 – monnef

+0

解決策は、コンテキストを変更して、型なしの値と「すべての」値を取り除くことです。 – Duncan

関連する問題