TypeScriptから使う場合にちょっとだけ破壊的な変更があるので告知します。
変更点
applySchemaObject()
をコールする時にジェネリクスの型指定が不要になりました。
例を示します。
// これまで import vs from "value-schema"; // import vs from "https://deno.land/x/value_schema@v3.0.0-rc.7/mod.ts"; // Denoで動かす場合はこちら interface User { id: number; name: string; } const schemaObject: vs.SchemaObject = { id: vs.number(), name: vs.string(), }; const user = vs.applySchemaObject<User>(schemaObject, { id: "0123", name: "John Doe", }); console.log(typeof user.id, user.id); console.log(typeof user.name, user.name);
今までは、
<User>
の型指定がないと関数の戻り値のプロパティーが認識されませんでした。
今後はこの型指定が不要になります。というか指定すると変なエラーが出ます。
// これから import vs from "value-schema"; // import vs from "https://deno.land/x/value_schema@v3.0.0-rc.8/mod.ts"; // Denoで動かす場合はこちら const schemaObject = { id: vs.number(), name: vs.string(), }; const user = vs.applySchemaObject(schemaObject, { id: "0123", name: "John Doe", }); // プロパティー自体も、プロパティーの型も認識されているので固有メソッドを使える console.log(typeof user.id, user.id.toFixed()); console.log(typeof user.name, user.name.toUpperCase());
何もしなくても
id
やname
が適切な型として認識されるようになり、冗長なinterface定義が不要になりました。
また、これに伴い
vs.SchemaObject
型が廃止されました。
結果として、特に型を指定することなくJavaScript版と変わらないコードで書けるようになりました。
型パズルは終わらない
今回の型パズルはかなり悩まされましたが、実はまだ完全ではありません。
設定によってはプロパティーがnullableになることもあります。
// nullableになる例 import vs from "value-schema"; // import vs from "https://deno.land/x/value_schema@v3.0.0-rc.8/mod.ts"; // Denoで動かす場合はこちら const schemaObject = { id: vs.number({ifUndefined: null}), // 省略時はnull name: vs.string(), }; const user = vs.applySchemaObject(schemaObject, { name: "John Doe", }); // user.idはnullだけど、TypeScriptにはnumberとして認識されている // console.log(typeof user.id, user.id.toFixed()); // 型チェックは通るけど実行時エラー console.log(typeof user.id, user.id); console.log(typeof user.name, user.name.toUpperCase());
こういう場合にだけ
number | null
という型にすべく、新たな型パズルを解いています。
一番簡単なのは常にnullableにすることですが、そうするとアプリケーション開発で不要なnullチェックが増えて煩わしくなります。
解けるのはいつになることやら。
0 件のコメント:
コメントを投稿