我正在使用Typescript创建一个shogi游戏板.将棋盘有9个等级和档案.
我想断言一个9x9多维数组作为一种类型,以确保数组的大小和内容.
目前我正在以这种方式创建我的9x9板类型:
type Board9x9<P> = [
[P, P, P, P, P, P, P, P, P],
[P, P, P, P, P, P, P, P, P],
[P, P, P, P, P, P, P, P, P],
[P, P, P, P, P, P, P, P, P],
[P, P, P, P, P, P, P, P, P],
[P, P, P, P, P, P, P, P, P],
[P, P, P, P, P, P, P, P, P],
[P, P, P, P, P, P, P, P, P],
[P, P, P, P, P, P, P, P, P]
];
interface IShogiBoardInternalState {
board: Board9x9<IShogiPiece>;
playerName: string;
isYourTurn: boolean;
}
Run Code Online (Sandbox Code Playgroud)
问题:是否有一种不那么繁琐,更通用的方法来定义我称之为的元组类型Board9x9<P>?
Ale*_* L. 26
元组类型的最后一个元素可以是... X形式的rest元素,其中X是数组类型
为了限制元组的长度,我们可以使用交集 { length: N }
type Tuple<TItem, TLength extends number> = [TItem, ...TItem[]] & { length: TLength };
type Tuple9<T> = Tuple<T, 9>;
type Board9x9<P> = Tuple9<Tuple9<P>>;
Run Code Online (Sandbox Code Playgroud)
Tit*_*mir 12
一个快速的简化方法是创建一个Tuple9类型,该类型可用于创建矩阵的第一层和第二层:
type Tuple9<T> = [T, T, T, T, T, T, T, T, T]
type Board9x9<P> = Tuple9<Tuple9<P>>
Run Code Online (Sandbox Code Playgroud)
您可以借助 Tuple 类型别名制作任意 NxN 板:
type Tuple<T, N extends number, A extends any[] = []> = A extends { length: N } ? A : Tuple<T, N, [...A, T]>;
Run Code Online (Sandbox Code Playgroud)
所以在你的情况下你会做类似的事情:
type Tuple<T, N extends number, A extends any[] = []> = A extends { length: N } ? A : Tuple<T, N, [...A, T]>;
type Board9x9<P> = Tuple<Tuple<P, 9>, 9>;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2861 次 |
| 最近记录: |