Как вводить вызовы функций при использовании Function.prototype.apply

#javascript #typescript #types

#javascript #typescript #типы

Вопрос:

У меня есть следующие типы:

 type Options = 'A' | 'B' | 'C' | 'D'

type SpecificOptions = 'A' | 'B'

type OptionsValueType = {
  A: () => void,
  B: string
}
 

Я использую их для создания следующих методов класса:

 declare class MyClass {
  myFunction(option: 'A', value: OptionsValueType['A'])
  myFunction(option: 'B', value: OptionsValueType['B'])
  myFunction(option: Exclude<Options, SpecificOptions>, value: number)

}
 

Это отлично работает:
введите описание изображения здесь

И у меня также есть некоторый код, который вызывает myFunction внутри цикла, используя Function.prototype.apply , это выглядит примерно так:

 const calls = [
  ['A', 1],
  ['B', 1],
  ['C', 1],
]

for (const call of calls) {
  a.myFunction.apply(undefined, call)
}
 

Но приведенный выше код не показывает никакой ошибки типа.

Я не могу использовать as const в calls массиве, потому что он создается динамически (и даже если бы я мог, похоже, он тоже не работает).

Как ввести приведенный выше код, чтобы убедиться .apply , что он введен правильно? Или это в настоящее время невозможно с помощью Typescript?

Приведенный выше код доступен на void,
B: string
}

declare class MyClass {
myFunction(option: ‘A’, value: OptionsValueType[‘A’])
myFunction(option: ‘B’, value: OptionsValueType[‘B’])
myFunction(option: Exclude, value: number)

}

declare var a: MyClass

a.myFunction(‘A’, () => { })
a.myFunction(‘B’, »)
a.myFunction(‘C’, 1)

const calls = [
[‘A’, 1],
[‘B’, 1],
[‘C’, 1],
]

for (const call of calls) {
// @TODO Correctly type each arg pair, it should be throwing an error here.
a.myFunction.apply(undefined, call)
}» rel=»nofollow noreferrer»>этой игровой площадке Typescript

Комментарии:

1. Я не уверен, что понимаю заданный вопрос value: number и передаваемую '1' в нем строку.

2. » он создается динамически » — значит, вы ожидаете ошибку времени выполнения в зависимости от переданных значений, а не статическую ошибку компилятора?

Ответ №1:

Если calls создается динамически, то нет, нет способа получить ошибку времени компиляции на основе ее значения.

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

Если вы хотите сами проверить типы, вы могли бы сделать:

 for (const call of calls) {
  if (typeof call[0] !== 'string' || typeof call[1] !== 'string') {
    throw new Error('Both arguments to myFunction must be strings');
  }
  a.myFunction.apply(undefined, call)
}