我正在使用Typescript创建一个将棋游戏板。一个将棋板有9个等级和文件。
我想Assert一个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;
}
问:有没有一种不那么乏味、更通用的方法来定义这个元组类型(我称之为Board9x9<P>
)?
8条答案
按热度按时间ozxc1zmp1#
更新:
使用Recursive conditional types(在TypeScript 4.1.0中添加)可以:
Playground
Typescript 3在元组类型中引入了rest元素
元组类型的最后一个元素可以是形式为...X的rest元素,其中X是数组类型
为了限制元组的长度,我们可以使用与
{ length: N }
的交集这在初始化
Tuple
类型的变量时有效:这里有一个警告,如果你试图访问元组范围之外的索引处的非元素,typescript不会警告你:
有一个suggestion来添加一个通用的方法来指定元组类型的长度。
mbskvtky2#
一个快速简化的方法是创建一个
Tuple9
类型,该类型可用于创建矩阵的第一级和第二级:jaql4c8m3#
添加指定元组类型长度的通用方法#issuecomment-513116547
bq3bfh9z4#
您可以在元组类型别名的帮助下制作任意NxN电路板:
所以在你的例子中,你会这样做:
mpgws1up5#
我是这样分三步完成的
用法:
jaxagkaj6#
这可以在一条线上完成。
用法:
ztmd8pv57#
对于常见用例(如本题),您尝试创建的类型不应具有会改变底层数组的不安全数组方法(如
push
、pop
等),请注意以下几点:考虑使用仅限于某些索引的索引签名,而不是使用元组:
ruoxqz4g8#
虽然递归方法很优雅并且有效,但它被限制在N〈1000。如果您进行以下实验,它将无法工作
您将收到此错误:“类型示例化太深,可能是无限的。ts(2589)”
获取可以具有任意长度的通用固定大小数组的实用方法如下:
尽管如此,应该说这实际上等价于长度为1000的元组,但从技术上讲,它不是,而是始终显示为数组和{ length:N }