関数の最後にnever
を代入(またはアサート)することは、コンパイル時に徹底的なチェックを強制するためにTypescriptで使用される手法です。明示的な文字列のない徹底チェック
コンパイラがこれを検出するには、never
の代入/アサーションの前に関数が確実に戻るかどうかを調べるために、明示的な文字列が必要です。
Object.freezeの型付きバリエーションを導入することは可能でしょうか?オブジェクトリテラルだけで動作し、さらにチェーンを上回るので、次のようなことができますか?
さらに、Action.type(この例では)ののキーが自動的に作成されるインターフェイスを作成する方法はありますか?その場合、actionMap
をそのインタフェースとして宣言するだけでコンパイル時にチェックを強制することができます。
どちらも同じ問題の解決策です。差別化された共用体しか与えられていないので、コンパイル時に関数内の明示的な文字列を使用する必要はありません。
interface Increment {
type: 'increment'
}
interface Decrement {
type: 'decrement'
}
type Action = Increment | Decrement
const inc: Increment = { type: 'increment' };
const dec: Decrement = { type: 'decrement' };
//this would be a typescript variation
const actionMap = Object.freeze({
[inc.type]: n => n + 1,
[dec.type]: n => n-1
});
function doAction(action: Action, val: number): number {
if(actionMap[action.type]) {
return actionMap[action.type](val);
}
//this would error at compile time if the above checked failed
const _exhaustiveCheck: never = action;
}
console.log(doAction(inc, 1));
console.log(doAction(dec, 1));
actionMapが、識別された共用体 'Action'内のすべての' type'値の値を持っているかどうかチェックしたいとします。これは正しいです? –
うん!そのとおり :) – davidkomer