TypeScript: параметр подписи индекса должен быть строкой или числом при попытке использовать строку | число - PullRequest
2 голосов
/ 24 апреля 2019

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

{
  allIds: [1],
  byId: {
    1: {...}
  }
}

OR

{
  allIds: ['1'],
  byId: {
    '1': {...}
  }
}

Я пытаюсь создать интерфейс под названием IOutput для этого.

Я пробовал это:

interface IOutput {
  allIds: string[] | number[]
  byId: {
    [key: number | string]: any
  }
}

Но это дает мне следующую ошибку

Тип параметра подписи индекса должен быть «строка» или «число». TS (1023)

Кажется, работает, когда я делаю это:

interface IOutput {
  allIds: string[] | number[]
  byId: {
    [key: number]: any
  }
}

OR

interface IOutput {
  allIds: string[] | number[]
  byId: {
    [key: string]: any
  }
}

Но это не то, чего я пытаюсь достичь. Я также попробовал это, и это дает мне ту же ошибку:

type StringOrNumber = string | number

interface IOutput {
  allIds: string[] | number[]
  byId: {
    [key: StringOrNumber ]: any
  }
}

Как мне добиться того, что я пытаюсь сделать?

1 Ответ

3 голосов
/ 24 апреля 2019

Это ограничение текущего способа записи индексов (это изменится достаточно скоро ).Параметр подписи индекса может быть только number или string (именно эти типы, а не их объединение, не литеральные типы).Тем не менее, вы можете иметь две подписи индекса, одну для number и одну для string.

Есть еще один маленький быстрый, если у вас есть подпись string, вы можете индексировать number какЧто ж.Таким образом, это означает, что если индекс string и индекс number имеют одинаковый тип возвращаемого значения, вам просто необходим строковый индекс

interface IOutput {
    allIds: string[] | number[]
    byId: {
        [key: string]: any
        // [key: number]: any // Valid but not necessary
    }
}

let o: IOutput = {
    allIds: [1],
    byId: {
        1: {}
    }
}
let o2: IOutput = {
    allIds: ['1'],
    byId: {
        '1': {}
    }
}
...