Как проверить, является ли объект массивом только для чтения в TypeScript? - PullRequest
2 голосов
/ 22 мая 2019

Как выполнить проверку массива (например, Array.isArray()) с массивом только для чтения (ReadonlyArray)?

Как пример:

type ReadonlyArrayTest = ReadonlyArray<string> | string | undefined;

let readonlyArrayTest: ReadonlyArrayTest;

if (readonlyArrayTest && !Array.isArray(readonlyArrayTest)) {
  // Here I expect `readonlyArrayTest` to be a string
  // but the TypeScript compiler thinks it's following:
  // let readonlyArrayTest: string | readonly string[]
}

С обычным массивом TypeScriptКомпилятор правильно распознает, что это должно быть строкой внутри условия if.

1 Ответ

4 голосов
/ 22 мая 2019

Вот соответствующий вопрос в машинописи.

Предложенный обходной путь @ jcalz добавляет перегрузку к объявлению isArray:

declare global {
    interface ArrayConstructor {
        isArray(arg: ReadonlyArray<any> | any): arg is ReadonlyArray<any>
    }
}
...