В Typescript, как я могу указать тип возвращаемой функции, которая может возвращать несколько типов?

#javascript #typescript

Вопрос:

У меня есть многоразовый метод getFilters , который может возвращать несколько различных типов

 getFilters(): IListFilteringType {...}
 
 type IListFilteringTypeMultiSelect = (string | number)[];
type IListFilteringType = boolean | string | number | IListFilteringTypeMultiSelect;
 

Когда я звоню getFilters , как я могу указать, что я знаю, что возвращаемое значение имеет тип IListFilteringTypeMultiSelect , а не одно из других возможных значений IListFilteringType ?

Спасибо

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

1. Откуда ты знаешь? Здесь может быть более элегантное решение.

2. Влияет ли тип параметров, передаваемых функции, на тип возвращаемого значения детерминированным образом? В этом случае попробуйте перегрузить подписи . Если на основе аргументов невозможно определить, какой из типов будет возвращен, используйте тип объединения , как вы уже сделали, и приведите результат, используя as , как описано в ответе Вухайка.

3. Несколько типов возвращаемых значений-это признак того, что ваша функция делает слишком много. Разделите его на более мелкие функции, которые возвращают только один тип, и их будет легче читать и понимать.

Ответ №1:

Если вы уверены в типе возвращаемой функции для конкретного выполнения, вы можете привести возвращаемое значение с помощью as .

 const variable = functionResponse as IListFilteringTypeMultiSelect;
 

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

1. Есть ли способ превратить это в какое-то условное условие? Например, может быть, если функция возвращает логическое значение, я хочу сделать X, но если функция возвращает строку, я хочу сделать Y? Я предполагаю что-то вроде if (переменная как логическая) { /*X*/ } иначе if (переменная как строка) (v{ /*Y*/}?

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