「不明」対「すべて」


190

TypeScript 3.0はunknown、Wikiによるとタイプを導入しています。

unknownは組み込み型であるため、予約済みの型名になりました。unknownの使用目的に応じて、宣言を完全に削除するか(新しく導入されたunknown型を優先)、または別の名前に変更することができます。

違いは何であるunknownとはany?いつunknownオーバーで使用すべきanyですか?

回答:


233

詳細についてunknownは、PRまたはRCの発表で確認できますが、その要点は次のとおりです。

[..]どれがタイプセーフかは不明です。unknownは、unknownに割り当て可能ですが、unknownは、それ自体と型アサーションまたは制御フローベースのナローイングなしでは割り当てられません。同様に、未知のものに対する操作は、最初に特定のタイプにアサートまたはナローイングしない限り許可されません。

いくつかの例:

let vAny: any = 10;          // We can assign anthing to any
let vUnknown: unknown =  10; // We can assign anthing to unknown just like any 


let s1: string = vAny;     // Any is assigable to anything 
let s2: string = vUnknown; // Invalid we can't assign vUnknown to any other type (without an explicit assertion)

vAny.method();     // ok anything goes with any
vUnknown.method(); // not ok, we don't know anything about this variable

推奨される使用法は次のとおりです。

TypeScriptで最小機能の型を記述したい場合がよくあります。これは、「これは任意の値になる可能性があるため、使用する前になんらかのチェックを実行する必要がある」ことを通知するAPIに役立ちます。これにより、ユーザーは戻り値を安全にイントロスペクトする必要があります。


35
C#の背景から来る誰もが、anyのようなものであるdynamicunknownのようなものですobjectunknown型安全なだけなので、私は好きです。名前を混乱させます。
nawfal

1
私は、これは比較することが公正であることを知っていないunknownobject私はcontravarianceと共分散の面であなたがで取得しているかを見ると思いますが、@nawfal(例えば、任意のオブジェクト型に代入されるobjectためものの、unknown任意のオブジェクトまたはプリミティブ割り当てることもできます-同様にunknownanyまたは自体objectに割り当てることができますdynamic。TSのドキュメントを参照してください理由サイドノートでは、私は不明だunknownそれは本当にすべてのタイプが含まれていないため、トップ型として_(ツ)_ /¯
ジョーダン

38

unknownとanyの違いは次のとおりです。

と同様にany、任意の値を割り当てることができunknownます。ただし、とは異なりany、typeの値のプロパティにアクセスしたり、unknownそれらを呼び出したり構築したりすることはできません。さらに、タイプの値はunknownunknownまたはにのみ割り当てることができますany

あなたが使用する必要があるときのあなたの質問に答えるためにunknownオーバーany

これは、「これは任意の値になる可能性があるため、使用する前になんらかのチェックを行う必要がある」ことを通知するAPIに役立ちます。これにより、ユーザーは戻り値を安全にイントロスペクトする必要があります。

型の変数の型チェックの例と詳細な説明については、TypeScript 3.0の発表unknownご覧ください。


21

any タイプ:

anyタイプは、すべての可能なJS値を表します。すべてのタイプはtypeに割り当て可能anyです。したがって、型anyは型システムのユニバーサルスーパータイプです。TSコンパイラーは、入力された値に対する任意の操作を許可しますany。例えば:

let myVar: any;

myVar[0];
myVar();
myVar.length;
new myVar();

多くの場合、これはTSコンパイラーには寛大すぎます。つまり、実行時エラーが発生することがわかっている可能性のある操作を許可します。

unknown タイプ:

unknownタイプは(同じように表しany、すべての可能なJS値)。すべてのタイプはtypeに割り当て可能unknownです。したがって、型unknownは型システムのもう1つのユニバーサルスーパータイプです(と一緒にany)。ただし、TSコンパイラ typedされた値に対する操作を許可しませunknown。さらに、unknownタイプはタイプにのみ割り当て可能anyです。例はこれを明確にします:

let myVar: unknown;

let myVar1: unknown = myVar;   // No error
let myVar2: any = myVar;       // No error
let myVar3: boolean = myVar;   // Type 'unknown' is not assignable to type 'boolean'

// The following operations on myVar all give the error:
// Object is of type 'unknown'
myVar[0];
myVar();
myVar.length;
new myVar();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.