Аргумент типа .. не присваивается параметру типа .. в машинописном и блочном тесте

theGreenCabbage спросил: 12 мая 2018 в 04:10 в: javascript

Я пытаюсь написать единичный тест для пользовательского метода, который я написал для Highcharts.

Для моего теста мне нужно создать объект Highcharts.Point, чтобы перейти в мою настраиваемую утилиту метод. Вне теста объект Point создается автоматически при визуализации диаграммы, но для моего теста мне нужно создать пользовательский с моими собственными параметрами.

Моя пользовательская точка объект, называемый PointObjectExtended, является расширением Highcharts.Point, где dataLabel - размеры меток значений в точке, а shapeArgs - размеры прямоугольника (в основном, индивидуальный график).

Это определения типов:

export interface PointObjectExtended extends Highcharts.PointObject {
  dataLabel: DataLabel
  shapeArgs: ShapeArguments
}export interface DataLabel {
  width: number
  height: number
  hide (): void
}export interface ShapeArguments {
  width: number
  height: number
}

В моем тесте у меня есть что-то из следующего:

    const point = {
      shapeArgs: { width: 20, height: 20 },
      dataLabel: { width: 20, height: 20, hide: jasmine.createSpy('hide spy') }
    }
    hide(point)
  })

И это реализация метода:

function hide (point: PointObjectExtended) {
  ..
  const shape = point.shapeArgs
  const label = point.dataLabel
  ..
}

Ошибка, которую я получаю, когда пытаюсь передать мой объект point в hide():

Argument of type '{ shapeArgs: { width: number; height: number; }; dataLabel: { width: number; height: number; hide...' is not assignable to parameter of type 'PointObjectExtended'.
  Property 'category' is missing in type '{ shapeArgs: { width: number; height: number; }; dataLabel: { width: number; height: number; hide...'.

Кажется, я хочу, чтобы я объявлял остальную часть Highcharts.Point object. Я не думаю, что это правильный способ приблизиться к нему, но я не уверен, что еще я могу сделать.

Итак, мой вопрос: как создать PointObjectExtended, который Я могу перейти к методу модульных тестов?

Один из вариантов заключается в том, что для моего метода я могу установить тип point на any, и он согласится с моей подделкой point object в тесте, но я не хочу использовать any, очевидно.

function hide (point: any) {
  ..
  const shape = point.shapeArgs
  const label = point.dataLabel
  ..
}

2 ответа

Jonas W. ответил: 12 мая 2018 в 04:15

Просто создайте новый интерфейс, который не расширяет высоту:

export interface PointObjectExtension {
  dataLabel: DataLabel
  shapeArgs: ShapeArguments
}type PointObjectExtended = Highcharts.PointObject & PointObjectExtension;

Итак, вы можете просто сделать это в своей функции:

function hide(point: PointObjectExtension) {
  //...
}
theGreenCabbage ответил: 12 мая 2018 в 04:22
Я делаю это в тестовом файле?
Jonas W. ответил: 12 мая 2018 в 04:22
@theGreenCabbage не имеет значения.
theGreenCabbage ответил: 12 мая 2018 в 07:38
Я понял лучшее решение
theGreenCabbage ответил: 12 мая 2018 в 07:06

Вам нужно сделать две вещи: во-первых, объявить point как Partial.

В тесте вам нужно объявить Partial из PointObjectExtended, а затем введите в него вход.

  it('my nice test', function () {
    const point: Partial<PointObjectExtended> = {
      shapeArgs: { width: 20, height: 20 },
      dataLabel: { width: 26, height: 26 }
    }
    hide(point as PointObjectExtended)
    expect(hideSpy).toHaveBeenCalled()  })
Jonas W. ответил: 12 мая 2018 в 03:41
Нет, небезопасное типирование - это уродливый и небезопасный способ сделать это.