2020年6月14日日曜日

value-schema v3.0.0-rc.8を公開しました

前回同様、中途半端なバージョンでのリリース報告です。 

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());
何もしなくてもidnameが適切な型として認識されるようになり、冗長な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 件のコメント:

コメントを投稿