Nano Hash - криптовалюты, майнинг, программирование

Typescript: как выразить общую функцию, где тип ограничен одним из нескольких типов

Например, если метод добавляет два аргумента, a и b, где они должны быть одного типа, и этот тип должен быть либо строкой, либо числом.

Попытка 1:

function add(a: string | number, b: string | number) { 
    return a + b; 
}

Это не сработает, потому что типы a и b могут не совпадать; поэтому результирующая ошибка имеет смысл: error TS2365: Operator '+' cannot be applied to types 'string | number' and 'string | number'.

Попытка 2:

function add<T extends string | number>(a: T, b: T) {
    return a + b;
}

Это возвращает тот же код ошибки: error TS2365: Operator '+' cannot be applied to types 'T' and 'T'.

Попытка 3:

function add(a: string, b: string): string;
function add(a: number, b: number): number;
function add(a: any, b: any) {
    return a + b;
}

Это (перегрузка функций) работает правильно, но кажется излишним. Есть ли более элегантный способ выразить это?


Ответы:


1

Вы также можете объединить свои попытки 2 и 3 следующим образом:

function add<T extends string | number>(a: T, b: T): T;
function add(a: any, b: any) {
    return a + b;
}

Затем вы можете использовать его следующим образом:

// Return type is `number`
add(1, 2);
// Return type is `string`
add('1', '2');
add<number>(1, 2);
add<string>('1', '2');

... и это вызывает ошибки типа, как и ожидалось:

add(1, '2');
add<number>('1', '2');
add<string>(1, 2);
add(true, false);

Однако, если вы не собираетесь использовать тип ввода, я бы придерживался только перегрузок функций. Самый простой для понимания на мой взгляд.

02.09.2015
  • Интересно. Вы случайно не знаете, почему это работает, а 2) нет? Я всегда думал о перегрузке просто как о способе добавления нескольких подписей; явно происходит какая-то другая магия. 03.09.2015
  • #2 не будет работать, потому что в сигнатуре реализации используется тип объединения string|number. Это приводит к тому, что реализация функции проверяется как <string|number> + <string|number>. Когда функция перегружена, сигнатура вызова и сигнатура реализации разделены. При вызове указанной выше функции проверяется тип объединения string|number, но реализация функции будет проверена как тип <any> + <any>. TS может использовать определение типа, чтобы выяснить тип возвращаемого значения в подписи вызова, но не может в случае <string|number> + <string|number>. 03.09.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..