type FixedArray<T, L extends number> = [T, ...T[]] & { length: L };
interface piece {}
type Board<W extends number, H extends number> = FixedArray<FixedArray<piece | null, W>, H>;
function createBoard<W extends number, H extends number>(
width: W,
height: H,
filler: (width: number, height: number) => piece | null = () => null
): Board<W, H> {
return Array.from({ length: height }, (_e, w) =>
Object.freeze(Array.from({ length: width }, (_e, h) => filler(w, h))) as FixedArray<piece | null, W>
) as Board<W, H>;
}
export const factories = {
board: {
/**
* 产生一个不可变棋盘
*/
create<W extends number, H extends number>(
width: W,
height: H,
filler: (width: number, height: number) => piece | null = () => null
): Board<W, H> {
return Object.freeze(Array.from({ length: height }, (_e, w) =>
Object.freeze(Array.from({ length: width }, (_e, h) => filler(w, h))) as ReadonlyArray<piece | null>
)) as Board<W, H>;
},
remove: {
row<W extends number, H extends number, count extends number>(
board: Board<W, H>,
count: count
rowIndex: number
): /* something like Board<W - count, H> */ {
// ...
}
} as const
} as const
} as const;
I'm new to Functional programming, and I'm working on fectories of Two dimensional grids or Boards.
I need to define something Board<W - count, H> or Board<W + count, H>
But it's obvious that I can't just define it like that.
BTW: if I define FixedArray as readonly, factories will throw a lot of type errors, and define all of them as const won't fix, I want to know why this is happening
