◆ 呼び出されないならそこのチェックはスキップしてほしい

静的型付けでコンパイル時にチェックする言語だと 必要ないところまで型チェックしてエラーを出すのがうっとうしいです
コードを大幅に書き換え中 部分的に動作を確認したくて動かすということはよくあります
こういうときに実行されない部分もチェックしてエラーを出されます
呼び出してないんだから その内部のチェックはスキップするとかしてほしいものです

例えば x と y をプロパティに持つ型 A があって プロパティ名を v と w に書き換えました
今動作確認をしたい main モジュールでは v と w としていますが その他の sub モジュールではまだ x と y のままです
しかし実行しても sub モジュールの関数を呼び出す処理は無いようにしてるので呼び出されません
なのにエラーが出るので sub モジュールまで修正せざるを得ないです
コンパイルで解析するなら sub の関数は呼び出されないから構文的にあってれば型チェックとかはスキップしてほしいです

ただこの問題の原因って本来は x と y を持つという情報が必要なのにそれを A という名前にしてることだと思うんです
A という名前にしてるから A から x と y がなくなれば A を前提として x や y にアクセスしてるところで未定義プロパティへのアクセスとなります
A なんて名前をつけずにすべての箇所で x と y を持つオブジェクトとしておけば 一部を v と w にしても影響はありません
sub モジュールの方では x と y を持つオブジェクトを引数に受け取って x と y プロパティにアクセスしているだけなのでエラーにならないです
修正しないまま sub モジュールの関数を呼び出そうとすると引数の型が一致せずエラーになるというだけです
このときに sub モジュール側は変更せずにそのままにしたいなら呼び出し時に v と w を x と y に置き換えてオブジェクトを渡せば済みます

コード

コードがないと分かりづらいと思うので 調べると TypeScript は引数のところで直接プロパティを持ってることを書けるらしいので TypeScript で例を書いてみます
モジュールを分ける必要もないので 2 つの関数とします

元の形がこれです

type A = { x: number, y: number }

const main = () => {
const a: A = { x: 1, y: 1 }
console.log(fn1(a))
console.log(fn2(a))
}

const fn1 = (a: A): boolean => {
return a.x > a.y
}

const fn2 = (a: A): boolean => {
return a.x < a.y
}

この A のプロパティを v と w にします
fn1 だけを修正して fn2 は一旦使わないのでそのままにしておきます

type A = { v: number, w: number }

const main = () => {
const a: A = { v: 1, w: 1 }
console.log(fn1(a))
// console.log(fn2(a))
}

const fn1 = (a: A): boolean => {
return a.v > a.w
}

const fn2 = (a: A): boolean => {
return a.x < a.y
}

fn2 は呼び出されないのですが a.x と a.y のアクセスの部分でエラーと言われます
TypeScript は型のない JavaScript にするのでこれを無視してコンパイルできるのかもしれませんが たいていのコンパイル言語だとこういうのがあるとコンパイルが通りません

A という type を作らずそれぞれの引数で x と y というプロパティを持つオブジェクトと指定していたとします

const main = () => {
const a = { x: 1, y: 1 }
console.log(fn1(a))
console.log(fn2(a))
}

const fn1 = (a: { x: number, y: number }): boolean => {
return a.x > a.y
}

const fn2 = (a: { x: number, y: number }): boolean => {
return a.x < a.y
}

この場合も同じように a の値と fn1 を書き換えます

const main = () => {
const a = { v: 1, w: 1 }
console.log(fn1(a))
// console.log(fn2(a))
}

const fn1 = (a: { v: number, w: number }): boolean => {
return a.v > a.w
}

const fn2 = (a: { x: number, y: number }): boolean => {
return a.x < a.y
}

fn2 はエラーになりません
ただしコメントアウトされている fn2 の呼び出しをしようとするとエラーになります
fn2 の引数と処理を変えてもいいですし fn2 の処理はそのままとして fn2 の呼び出し時に fn2 が求める型に変換することもできます

const main = () => {
const a = { v: 1, w: 1 }
console.log(fn1(a))
console.log(fn2({ x: a.v, y: a.w }))
}

const fn1 = (a: { v: number, w: number }): boolean => {
return a.v > a.w
}

const fn2 = (a: { x: number, y: number }): boolean => {
return a.x < a.y
}

全部の箇所で書きたくない

一見良い解決策なんですが { x: number, y: number } のようなものを全部の箇所で書くのは流石に嫌です
プロパティ数がもっと多いこともありえますし
実際にやるなら B という新しい型を作って A は x と y のままで B を v と w とするとかでしょうか

わざわざ型を書かなければ そんな問題もないので TypeScript 使うくらいなら JavaScript なのですが その他のところだとそうもいかないんですよね