Как ввести guard для 2D-массива в TypeScript?

#typescript

#typescript

Вопрос:

Я пытался написать такой код:

 const x: string[] | string[][] = blah();
if (Array.isArray(x[0])) {
    // I expect x to be inferred to be string[][] here, but it's not!
}
  

Почему это не означает x , что это 2D-массив? Я делаю что-то не так, или это TypeScript?

Ответ №1:

не существует способов ввести guard для этих конкретных объединений. Тем не менее, вы можете довольно легко создать пользовательскую функцию защиты типа:

 /** Custom type guard */
const isArrayArray = (x): x is string[][] => Array.isArray(x[0]);

const x: string[] | string[][] = [];
if (isArrayArray(x)) {
    // x:string[][]
  x;
}
  

Еще

здесь рассматриваются пользовательские защиты: https://basarat.gitbooks.io/typescript/content/docs/types/typeGuard.html