型で単位を表す
TypeScript 4.0時代の記事なので、最新の機能合わせたらなにか改善できたりするのかなmiyamonz.icon
型レベルの自然数の計算あたりは、HOTScriptとかに任せてしまうとか
たしかにmrsekut.icon
これがちゃんと型エラーにならないのすごいmrsekut.icon
code:ts
const a = mul(m1, l1); // Mass * Length
type A = typeof a;
const b: A = mul(div(mul(m1, l1), l1), l1); // Mass * Length
型レベルの演算と簡約がちゃんとできている
記事読んだら意外と単純に実装できそうなイメージは湧いた
が、ただの演算のためにaddとかmulとかの関数を使わざるを得ないのはやや厳しいmrsekut.icon
ランタイムでやっちゃうのも考えて良いのでは?miyamonz.icon
code:js
const _1kg = {
value: 1000,
units: {
g: 1
}
}
const _1m = {
value: 1,
units: {
m: 1
}
}
function 単位同士の掛け算(u1,u2) {
const entires = unitKeys.map( k => {
const beki = u1k ?? 0 + u2k ?? 0 })
return Object.fromEntries(entries)
}
単位を型でちゃんと扱いたい、というのは、ビジネス上の場合は、間違った単位の計算をやっているかを検出するのが主目的
めっちゃたくさん計算しないケースもあるから、ランタイムコストを払っても良いのでは
↑ m・kgなら {units: {m:1,kg:1}}で、m^2なら{units: {m:2}}になるってことかmrsekut.icon
(今そこまでモチベがあるわけではないが)主目的はやっぱ「静的に検出できる」の方が関心ありますmrsekut.icon
単位の組み合わせの単位を定義できる
code:fs
let force1 = 5.0<kg m/sec^2>
let force2 = 5.0<N>
force1 = force2 // 同一のものはちゃんとtrueになる
単位の異なる加減演算はエラーになる
code:fs
3.0<foot> + 2.0<foot> // OK
3.0<foot> + 2.0 // error
普通の演算子+や*で書けるの嬉しい