Как отклонить несовместимые аргументы функции в TypeScript с неизвестным типом - PullRequest
1 голос
/ 03 августа 2020

Приведенный ниже код принят TypeScript в строгом режиме, хотя я этого не хочу. Аргумент функции value является допустимым типом unknown или any: на данном этапе разрешено что угодно, поскольку он передается по прокси.

Однако из-за неизвестного соответствия и разрешенного уменьшение количества аргументов, тестовый вызов принят.

interface Mine { x: number }

function handle(
  field: number,
  onChange: (field:Mine, value: unknown) => void,
) {
}

function testCall() {
  handle(123, (value: unknown) => {})
}

Есть ли способ отклонить функции, которые принимают меньше аргументов, чем ожидалось? Или есть способ отклонить неявные преобразования в unknown?

1 Ответ

1 голос
/ 03 августа 2020

Функция, которая принимает меньше аргументов, может быть помещена вместо функции, которая принимает больше, и аналогично функция, которая принимает аргументы с более широкими типами, может быть помещена вместо функции, которая принимает более узкие типы. ( Документация )

В частности, в этом случае (value: unknown) => void может принимать 2 параметра, а поскольку value равно unknown, он должен иметь возможность обрабатывать value из введите Mine.

Типичный пример его использования - .map. .map((v: unknown) => `${v}`) работает, хотя map также имеет аргумент для индекса и аргумент для исходного массива.

Если жизненно важно, что вы не можете случайно не включить тип, вы можете вместо этого использовать класс со свойствами вместо аргументов и основной метод, который не принимает аргументов:

abstract class OnChange {
  private field: Mine;
  private value: unknown;
  public constructor (field: Mine, value: unknown) { this.field = field; this.value = value; }
  public abstract main(): void;
}

Это кажется Хотя, похоже, больше проблем, чем оно того стоит, поэтому я бы просто использовал функции с сужающимися аргументами, как и было задумано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...