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 件のコメント:
コメントを投稿