Как сузить типы возвращаемых значений на основе дискриминантов

Скажем, у меня есть функция с аргументом, который может принимать только два значения type Value = "a" | "b". Теперь у меня есть функция, которая на основе значения этого аргумента должна возвращать другой результат:


type Value = "a" | "b";

function Method(value: Value){
  if (value === "a") return 1000;
  else return "word"
}

const Result = Method("a");

Теоретически, если мое значение равно «а» (которое можно вывести при вызове функции с постоянным значением «а»), я верну число. Если значение равно "b", я ожидаю строку.

Что не так в этом фрагменте и как я могу заставить это работать?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать перегрузки функций, как показано ниже:

type Value = "a" | "b";

function Method(value: "a"): number;
function Method(value: "b"): string;
function Method(value: Value){
  if (value === "a") return 1000;
  else return "word";
}

const Result = Method("a");

Идеальный! Перегрузка функций сделала свое дело, с той лишь оговоркой, что возвращаемый тип реализации также должен быть определен, как и объединение вышеуказанных перегрузок. Спасибо!

razgraf 09.02.2023 23:22

Вы можете использовать оператор switch вместо оператора if и only в этих двух значениях:

switch (value) {
  case 'a':
    return 1000;
  case 'b':
    return 'word'
}
return null; //in case the value falls out the expected values but this is optional

Другие вопросы по теме