Typescript обещает весь смешанный массив и оператор распространения - PullRequest
0 голосов
/ 03 мая 2018

У меня есть обещание со смешанным массивом, и я использую оператор распространения, чтобы разделить выходные данные на 2 переменные, первая как IUnpackedFile, а остальные как IDescriptionBody []. Я решил, что приведение 2 переменных с использованием ключевого слова as. Код ниже:

    return Promise.all<IUnpackedFile | IDescriptionBody>([
      unpackFromHttp("/data/withTexture/5782622127702409215.dat"),
      ...texturePromises
    ])
  .then(([bufferArray, ...rest]) => {
    // casting here
    const description = (rest as IDescriptionBody[]).reduce(
      (res, val) => {
        res[val.CellId] = val;
        return res;
      },
      {} as IDescription
    );

    const meshMaterials = extractMesh(
      // casting here
      (bufferArray as IUnpackedFile).result,
      description
    );

Почему я не могу набрать приведение вывода с использованием кортежа?

then(([bufferArray, ...rest]: [IUnpackedFile , IDescriptionBody[]])

Это ошибка, которую я получаю:

Argument of type '([bufferArray, ...rest]: [IUnpackedFile, IDescriptionBody[]]) => void' is not assignable to parameter of type '((value: (IDescriptionBody | IUnpackedFile)[]) => void | PromiseLike<void>) | null | undefined'.
  Type '([bufferArray, ...rest]: [IUnpackedFile, IDescriptionBody[]]) => void' is not assignable to type '(value: (IDescriptionBody | IUnpackedFile)[]) => void | PromiseLike<void>'.
    Types of parameters '__0' and 'value' are incompatible.
      Type '(IDescriptionBody | IUnpackedFile)[]' is not assignable to type '[IUnpackedFile, IDescriptionBody[]]'.
        Property '0' is missing in type '(IDescriptionBody | IUnpackedFile)[]'.

EDIT: до сих пор я нашел это: Предложение: Вариативные виды По сути, это предложение, которое обсуждается с 30 октября 2015 года.

1 Ответ

0 голосов
/ 03 мая 2018

Почему я не могу набрать приведение вывода с помощью кортежа?

Потому что вы не можете привести массив к кортежу. Вот тот же код, показанный ниже:

declare const foo: number[];
const bar: [number, number] = foo; // Error: property `0` is missing

Подробнее

Вы на самом деле не используете тип. Просто присвоение, которое дает вам ошибку, такую ​​же, как в примере, который я показал. Утверждение типа будет фактически исправлено:

declare const foo: number[];
const bar: [number, number] = foo as [number, number]; // OK
...