Вопрос аннотации к машинописному тексту: массивы со значениями ключей

#typescript #typescript-typings

Вопрос:

Кто-нибудь знает, почему это происходит в соответствии с VSCode?

 interface Point {  x: number;  y: number; }  let grid: [key: number, value: [key: number, value: Point]];  // ...  // Gives an object of type number | [key: number, value: Point] var col = grid[-5]; // Gives an object of type number | Point var pnt = (col as [key: number, value: Point])[-2];  

Кто-нибудь может объяснить, пожалуйста?

Я хочу, чтобы у них не было number |

Ответ №1:

Этот:

 let grid: [key: number, value: [key: number, value: Point]];  

объявляет тип кортежа: массив с 2 членами, где первый имеет тип number , а второй-другой кортеж, например:

 [3, [4, somePoint]]  

Используйте объект вместо массива, чтобы grid[someNum] получить столбец:

 let grid: {  [key: number]: {  [key: number]: Point;  }; }  

Вы также можете рассмотреть возможность использования карты вместо динамических имен свойств (карты лучше подходят для такого рода вещей, и вы иногда будете сталкиваться с проблемами с такого рода динамическими именами свойств в машинописном тексте).

 type Col = Maplt;number, Pointgt;; const grid = new Maplt;number, Colgt;();  

Ответ №2:

Переменная let grid инициализируется здесь:

 let grid: [key: number, value: [key: number, value: Point]];  

Здесь «ключу» присваивается номер. Если вы не хотите, чтобы он возвращал эту часть, вам нужно удалить key: number часть кода