Массив из значений и порядка определения объекта - PullRequest
0 голосов
/ 09 июля 2019

с использованием TypeScript Я хочу создать массив значений, используя объект определения порядка.

Предположим, следующий пример:

  • значения являются столбцом таблицы headers
  • заказ - запрашиваемый order этих столбцов

Типы:

type H = {title: string, description: string};
type O = { [key in keyof H]: number };
const headers: H = {
 description: 'Description',
 title: 'Title',
}
const order: O = {
 title: 0,
 description: 1,
}

(предположим, что значения в order всегда "нормализованы", чтобы быть действительными индексами массива (они являются уникальными положительными инициаторами в последовательном порядке, начиная с 0)

Я хочу следующий вывод:

['Title', 'Description']

Я надеялся, что ниже будет работать:

mapToArray = (headers: H, order: O): string[] => {
    let result: string[] = [];
    for (let k in headers) {
      result[order[k]] = headers[k];
    }

    return result;
  }

однако я получаю следующую ошибку:

Type 'H[Extract<keyof H, string>]' is not assignable to type 'string[][O[Extract<keyof H, string>]]'.
  Type 'H' is not assignable to type 'string[]'.
    Type 'H[Extract<keyof H, string>]' is not assignable to type 'string'.
      Type 'H[string]' is not assignable to type 'string'.

Есть предложения, как это исправить? Заранее спасибо.

Параметры компилятора TS:

"compilerOptions": {
    "plugins": [
      {
        "name": "tslint-language-service"
      }
    ],
    "target": "es6",
    "lib": [
      "dom",
      "es2015",
      "es2017.object",
      "es2016.array.include"
    ],
    "module": "esnext",
    "moduleResolution": "node",
    "skipLibCheck": true,
    "removeComments": true,
    "preserveConstEnums": true,
    "sourceMap": false,
    "outDir": "build",
    "jsx": "preserve",
    "experimentalDecorators": true,
    "noUnusedParameters": true,
    "noUnusedLocals": true,
    "declaration": false,
    "allowJs": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true
  }

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Я только что создал стек, без проблем

https://stackblitz.com/edit/angular-56954561-array-from-values-and-order-definition-object

Единственное изменение, которое я сделал

type O = { [key in keyof H]: number };
0 голосов
/ 09 июля 2019

Проблема в том, что прямо сейчас компилятор TS предполагает, что переменная k в вашем цикле for является string.

Просто дайте ему знать, что это ключ H:

type H = {title: string, description: string};
type O = { [key in keyof H]: number };

const headers: H = {
 description: 'Description',
 title: 'Title',
}

const order: O = {
 title: 0,
 description: 1,
}

const mapToArray = (headers: H, order: O): string[] => {
    let result: string[] = [];
    let k: keyof H;
    for (k in headers) {
      result[order[k]] = headers[k];
    }

    return result;
  }

Обновление : я также принял подсказку @ RezaRahmati, исправив определение O, в результате которого возникла несвязанная ошибка.

Смотрите на детской площадке TS.

...