#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 var a: MyClass
a.myFunction(‘A’, () => { })
a.myFunction(‘B’, »)
a.myFunction(‘C’, 1)
const calls = [
[‘A’, 1],
[‘B’, 1],
[‘C’, 1],
]
Комментарии:
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)
}