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