any と unknownanyJSON.parse()String()unknownTypeScript では、any と unknown はすべての値を含む型です。この章では、それぞれが何であり、何に使用できるかを調べます。
any と unknown は TypeScript のいわゆる *最上位型* です。Wikipedia を引用します。
最上位型 […] は 普遍的型で、普遍的スーパークラス とも呼ばれます。その理由は、特定の型システム内の他のすべての型はサブクラスであること […] です。ほとんどの場合、利害関係の型システム内のすべて考えられる [値] を含む型です。
つまり、型を値の集合として見ると (型の詳細については [含まれるコンテンツではありません] を参照してください)、any と unknown はすべての値を含む集合です。補足すると、TypeScript には空集合である 最下位型 never もあります。
any値に型 any がある場合、どんなこともそれに対して行うことができます。
function func(value: any) {
// Only allowed for numbers, but they are a subtype of `any`
5 * value;
// Normally the type signature of `value` must contain .propName
value.propName;
// Normally only allowed for Arrays and types with index signatures
value[123];
}あらゆる型が型 any に割り当て可能
let storageLocation: any;
storageLocation = null;
storageLocation = true;
storageLocation = {};型 any はあらゆる型に割り当て可能
function func(value: any) {
const a: null = value;
const b: boolean = value;
const c: object = value;
}any を使用すると、TypeScript の静的な型システムから通常提供される保護が失われます。したがって、より具体的な型または unknown が使用できない場合にのみ、最後の手段として使用してください。
JSON.parse()JSON.parse() の結果は動的な入力に依存するため、戻り値の型は any です。(シグネチャからパラメータ reviver は省略しました)
JSON.parse(text: string): any;JSON.parse() は、型 unknown が存在する前に TypeScript に追加されました。そうでなければ、戻り値の型はおそらく unknown になっています。
String()任意の値を文字列に変換する関数 String() の型シグネチャは次のとおりです。
interface StringConstructor {
(value?: any): string; // call signature
// ···
}unknown型 unknown は型 any の型安全なバージョンです。any の利用を検討している場合、最初に unknown を検討してください。
any では何でもできますが、unknown ははるかに制限されています。
型 unknown の値に対して操作を実行する前に、まず次のようにして型を絞り込む必要があります。
function func(value: unknown) {
// @ts-expect-error: Object is of type 'unknown'.
value.toFixed(2);
// Type assertion:
(value as number).toFixed(2); // OK
}等価性
function func(value: unknown) {
// @ts-expect-error: Object is of type 'unknown'.
value * 5;
if (value === 123) { // equality
// %inferred-type: 123
value;
value * 5; // OK
}
}型ガード:
function func(value: unknown) {
// @ts-expect-error: Object is of type 'unknown'.
value.length;
if (typeof value === 'string') { // type guard
// %inferred-type: string
value;
value.length; // OK
}
}function func(value: unknown) {
// @ts-expect-error: Object is of type 'unknown'.
value.test('abc');
assertIsRegExp(value);
// %inferred-type: RegExp
value;
value.test('abc'); // OK
}
/** An assertion function */
function assertIsRegExp(arg: unknown): asserts arg is RegExp {
if (! (arg instanceof RegExp)) {
throw new TypeError('Not a RegExp: ' + arg);
}
}