Здравствуйте, Буравчик, Вы писали:
Б>Так функция и не вызовется с другими типами, если код не менять.
Не понял. У нас типы выводятся в момент компиляции файла.
Грубо говоря у нас есть файл, в нём код и в нём же тесты. Мы сначала запускаем интерпретатор, который игнорирует типы. Этот интерпретатор прогоняет все тесты в этом файле и во время каждого вызова функции запоминает типы значений, которые эта функция принимала и возвращала. А также, видимо, типы переменных.
Эта запомненная информация где-то сохраняется и представляет из себя типизированную сигнатуру функции.
Простой пример:
function f(n) {
let result;
if (n == 0) {
result = 1n;
} else {
const f1 = f(n - 1);
result = BigInt(n) * f1;
}
return result;
}
tests {
assert(f(0) == 1);
assert(f(3) == 6);
}
Тут мы прогнав тесты видим, что функция вызывается с параметром типа number и возвращает BigInt при всех выполнениях. То бишь после выполнения куда-то записывается что-то вроде
function f(n: number): BigInt {
let result: BigInt;
if (n == 0) {
result = 1n;
} else {
const f1: BigInt = f(n - 1);
result = BigInt(n) * f1;
}
return result;
}
и теперь её из другого файла нельзя будет вызвать со строкой или null-ом, будет ошибка компиляции.
Наверное можно даже не просто number выводить, а что-то вроде uint8. Или вообще конкретный тип, от 0 до 3 в данном примере. Типа нужен факториал со значениями побольше — пиши тесты на значения побольше.
Б>Ну и непонятно, что дальше-то что с этими типами делать, какая задача решалась?
Проверять при использовании в других файлах.