Как заставить функции обрабатывать возвращаемое значение (A | B) [] и A [] | B [] как эквивалент в машинописи - PullRequest
2 голосов
/ 18 апреля 2020

Кажется, типы (A | B)[] и A[] | B[] эквивалентны в TypeScript. Это может быть подтверждено следующим:

var test1: number[] | string[] = [1]
var test2: (number | string)[] = ["stuff"]
var test3: (number | string)[] = test1

Но, похоже, это ломается, когда эти типы появляются в возвращаемых функциях. Это проиллюстрировано ниже:

function getStuff(flag:number): number | string {
    if (flag == 0) {
        return 1
    } else {
        return "hello"
    }
}

function returnStuff(flag: number): number[] | string[] {
    let toReturn: (number | string)[] = [getStuff(flag)]
    // toReturn is of type (number | string)[] but trying to return it when the return type
    // is number[] | string[] fails even though they should be equivalent
    return toReturn;
}

У меня тогда два вопроса:

  1. В чем причина такого поведения и как его исправить, чтобы получить намеченное поведение?
  2. Есть ли в TS какой-либо механизм уровня типа, который можно использовать для преобразования между number[] | string[] и (number | string)[]

1 Ответ

3 голосов
/ 18 апреля 2020

В чем причина такого поведения

число [] | строка []

у вас есть два возможных массива: массив, содержащий только число, и массив, содержащий только строки

[1,2,3,4] //valid  
["foo", "bar"] //valid  
[1,2,"foobar"] //this is invalid

(число | строка) [ ]

У вас есть один возможный массив, который содержит число или строку.

[1,2,3,4] //valid  
["foo", "bar"] //valid  
[1,2,"foobar",3,"lorem"] //valid

В этом ключевом моменте следует помнить, что массив может содержать элемент с типом строка ИЛИ номер, независимо от того, все ли элементы в массиве одного типа или нет

Есть ли в TS какой-либо механизм уровня типа, который можно использовать для преобразования числа [] | строка [] и (число | строка) []

Вы все еще можете использовать свою строку [] или число [] как (строка | число) []

let x: number[] = [1,2,3,4]

return x as (number | string)[]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...