Форум программистов, компьютерный форум, киберфорум
TypeScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
 Аватар для IPcorp
17 / 16 / 1
Регистрация: 14.08.2017
Сообщений: 37

Избавиться от any, какие варианты?

14.03.2021, 01:37. Показов 2900. Ответов 6

Студворк — интернет-сервис помощи студентам
В typescript еще совсем бегинер, и возможно нубский вопрос, но все же. Какие есть варианты красиво избавиться от any?...без того же if, через дженерики:

JavaScript
1
2
3
4
5
6
7
8
9
10
type MType = number | string;
 
let v1: MType = 5;
let v2: MType = "6";
 
 
const sum = (p1: MType, p2: any): MType => p1 + p2;
 
 
console.log(sum(v1, v2));
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.03.2021, 01:37
Ответы с готовыми решениями:

Какие варианты предложите?
Здравствуйте уважаемые форумчане! Есть молодой сайт мною созданный, который я хочу продвинуть - но не знаю как лучше, нужны советы, вот...

Какие существуют варианты подключения БД
Всем Доброго времени суток!! Такой собственно вопрос: есть Provider=Microsoft.Jet.OLEDB.4.0; Data Source =... и ...

Посоветуйте, какие есть варианты
Нужно организовать автоматический обмен данными справочника "Сотрудники" между Бухгалтерией и ЗУП. Обе нетиповые, неуправляемые. По...

6
315 / 244 / 149
Регистрация: 03.10.2017
Сообщений: 886
Записей в блоге: 1
29.03.2021, 20:15
IPcorp, Смотря какую цель вы преследуете

JavaScript
1
2
3
4
5
6
7
8
type MType = number | string;
 
const v1: MType = 5;
const v2: MType = '6';
 
 
const sum = (p1: MType, p2: MType): MType => Number(p1) + Number(p2);
const concat = (p1: MType, p2: MType): MType => String(p1) + String(p2);
1
 Аватар для IPcorp
17 / 16 / 1
Регистрация: 14.08.2017
Сообщений: 37
30.03.2021, 21:58  [ТС]
Цель вот именно в том, что бы это одна функция обрабатывала. Как вариант через перегрузку:

JavaScript
1
2
3
4
function sum(p1: MType, p2: MType): MType;
function sum(p1: MType, p2: any): MType {
  return p1 + p2;
};
...по поводу приведения к any, раз до этого по типу все прошло, есть настороженность:

JavaScript
1
2
3
4
5
6
7
8
type MType = number | string;
 
// let v1: MType = 5;
// let v2: MType = "6";
 
const sum = (p1: MType, p2: MType): MType => p1 as any + p2;
 
console.log(sum(10, true));
0
315 / 244 / 149
Регистрация: 03.10.2017
Сообщений: 886
Записей в блоге: 1
31.03.2021, 11:02
IPcorp, Вы если отвечаете на сообщения. Ставьте меня в в ответ.
Во вторых, когда вы в типе указываете несколько типов, вы потом должны их внутри проверять, что они относятся именно к тому типу.

Какой смысл использовать типизацию, если вы потом используете any?
Вы должны проверять принадлежность объекта через typeof или instanceof

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
type MType = number | string;
 
// let v1: MType = 5;
// let v2: MType = "6";
 
const sum = (p1: MType, p2: MType): MType => {
  if (typeof p1 === 'string' || typeof p2 === 'string') {
    return Number(p1) + Number(p2);
  }
 
  return p1 + p2;
};
 
console.log(sum(10, '10'));
0
 Аватар для IPcorp
17 / 16 / 1
Регистрация: 14.08.2017
Сообщений: 37
31.03.2021, 22:57  [ТС]
Masson1848, не не, не нужно "ломать" приведение типов в javascript, которое по умолчанию. Эх, будем много букав, ну да лан

...в общем, исходя из приведенного типа MType, и операции сложения, у нас в JS будет как-то так:

JavaScript
1
2
3
4
5
6
const sum = (p1, p2) => p1 + p2;
 
console.log(sum(10, 20));       // 30
console.log(sum(10, "20"));     // 1020
console.log(sum("10", 20));     // 1020
console.log(sum("10", "20"));   // 1020
...вот эту функцию sum и нужно в TS нарисовать. С ограничением типов по union MType.

Без функции все отрабатывает как нужно:

JavaScript
1
2
3
4
5
6
7
8
type MType = number | string;
 
const v1: MType = 10;
const v2: MType = "20";
 
const sum: MType = v1 + v2;
 
console.log(sum);   // 1020
...а вот с функцией TS ругается на несовместимость типов при сложении.


Исходя из вышесказанного, вариант с
Цитата Сообщение от Masson1848 Посмотреть сообщение
принадлежность объекта через typeof или instanceof
, даже без явного приведения типов, кажется избыточным, впрочем, как и сама по себе приведенная функция:

JavaScript
1
2
3
4
5
6
7
const sum = (p1: MType, p2: MType): MType => {
  if (typeof p1 === 'string' || typeof p2 === 'string') {
    return Number(p1) + Number(p2);
  }
 
  return p1 + p2;
};
...которая сворачивается в:

JavaScript
1
const sum = (p1: MType, p2: MType): MType => Number(p1) + Number(p2);

Пока, как и говорил, строгая проверка и параметров, и возвращаемого значения, нормально отрабатывает либо при (можно и без any):

JavaScript
1
const sum = (p1: MType, p2: MType): MType => p1 as string + p2;
...либо при перегрузке функции:

JavaScript
1
2
3
4
function sum(p1: MType, p2: any): MType;
function sum(p1: any, p2: any): MType {
  return p1 + p2;
}

PS. Да, и по поводу
Цитата Сообщение от Masson1848 Посмотреть сообщение
Какой смысл использовать типизацию, если вы потом используете any?
с ходу не понял. Если имелась в виду перегрузка функции, то как бы же "overload signatures vs implementation signature". В общем, имею в виду: Overload Signatures and the Implementation Signature
1
315 / 244 / 149
Регистрация: 03.10.2017
Сообщений: 886
Записей в блоге: 1
01.04.2021, 11:54
Лучший ответ Сообщение было отмечено amr-now как решение

Решение

IPcorp, если вы хотите сделать как в js, но при этом ограничить тип. То можно не мучаться и сделать
JavaScript
1
2
3
4
5
6
7
type MType = number | string;
 
const v1: MType = 5;
const v2: MType = '6';
 
 
const sum = (p1: MType, p2: MType): MType => p1 as any + p2 as any;
И тогда у вас получится валидный код, который будет сам определять Своё поведение.
Так как функция будет возвращать сумму, когда два числа, всё остальное будет конкатенация строк.
И своим типом, вы просто ограничить принимаемые параметры. И всё
1
 Аватар для IPcorp
17 / 16 / 1
Регистрация: 14.08.2017
Сообщений: 37
03.04.2021, 04:13  [ТС]
Masson1848, ну как бы да, ограничить типом и принимаемые параметры, и получаемый результат. Виноват, все забываю, что на большинство вопросов в TS первым ответом чаще может быть подобие такого: "Все зависит от того, чего именно вы хотите в результате получить." Изначально вопрос был именно о том, как красиво избавиться от any. Правда как в JS оно то уже не будет, потому как типы. И таки да, в данном случае соглашусь, можно не мучаться. По сути что там в самой функции происходит не особо важно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.04.2021, 04:13
Помогаю со студенческими работами здесь

Какие есть варианты оптимизации скрипта?
Есть такая таблица CREATE TABLE `main_data` ( `date_work` datetime NOT NULL, `phone` char(13) NOT NULL, `main_state`...

Какие есть варианты в Environment.Exit()?
Возможно глупый вопрос, но какие есть коды в Environment.Exit(код)? Что они делают? Пример я знаю только один: Environment.Exit(0); ...

Получение почты, какие есть варианты
Привет всем, я ищу простой исходник получения почты на c# с помощью POP3 или аналогичных, например, у меня есть почта на мейлру, нашел...

Какие есть варианты создания массива?
Сразу к телу:1) Возможно ли создать массив не таким способом: var oldlayer=new Array(8) oldlayer='jj' oldlayer='09' oldlayer='ii'Можно...

Какие могут быть варианты решения
Нужно написать программу на Delphi 7. Суть ее токова: на экране(на форме) появляються прямоугольники в различных местах, если два...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru