Generics
generics: mutable な配列の共変性は不正な値を混入させ得る
TypeScript では number[] を (number | string)[] として渡せるため、可変 API を設計するときは注意が必要です。
SourcearrayVariance.ts
Node.js 22
export function appendMixed(values: (number | string)[]): void {
values.push("unexpected");
}TestarrayVariance.test.ts
Node.js 22
import assert from "node:assert/strict";
import test from "node:test";
import { appendMixed } from "../../src/generics/arrayVariance.js";
test("広い要素型の配列APIはnumber配列へ文字列を追加できる", () => {
const numbers: number[] = [1];
appendMixed(numbers);
assert.deepEqual(numbers, [1, "unexpected"]);
});01Assertion
このテストで確認できること
- number[] を広い要素型の関数に渡せる
- 広い API は元の配列へ文字列を追加できる
読み取り専用引数なら readonly T[] を優先し、変更する必要がある API では型パラメータと書き込み対象を慎重に分けます。
OBSERVED RESULT
expected: numbers after appendMixed → [1, "unexpected"]
actual: [1, "unexpected"]