Typescript: Преобразование массива в объединение + сопоставленные типы массивов без сохранения порядка типов

Созданный на 7 мая 2019  ·  1Комментарий  ·  Источник: microsoft/TypeScript


Версия TypeScript: 3.4.0-dev.201xxxxx


Условия поиска:

Утерян порядок ключей сопоставленных типов

Код

type Initial = [1, 2, 3, 4]

type FindReplace<T extends any[], Find, Replace> = {
  [K in keyof T]: T[K] extends Find ? Replace : T[K]
}

// Map over array and replace '2'
type ResultArray = FindReplace<Initial, 2, 'was 2'>
// => [1, "was 2", 3, 4]

// Now accessing the array values using [number], the type
// order is lost. This matters because now when the union is later
// cast as a intersection, the types are in the wrong order
type Result = ResultArray[number]
// => 1 | 3 | 4 | "was 2

Ожидаемое поведение:

Сопоставление типов должно сохранять ключевой порядок

Фактическое поведение:

Сопоставление типов сохраняет "тип", но порядок ключей теряется при выполнении оператора T[keyof T]

Связанные вопросы:

Question

Самый полезный комментарий

Союзный порядок - это не то, на что вам следует рассчитывать. @RyanCavanaugh упомянул об этом, когда здесь обсуждалось объединение кортежей:

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

>Все замечания

Союзный порядок - это не то, на что вам следует рассчитывать. @RyanCavanaugh упомянул об этом, когда здесь обсуждалось объединение кортежей:

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

Была ли эта страница полезной?
0 / 5 - 0 рейтинги