Если у вас есть void
-возвратная функция, которая имеет эффект сужения типа одного из его параметров, и если вы используете TypeScript 3.7 или выше, вы можете сделать ее функцией подтверждения и компилятор примет это утверждение во внимание. Возвращаемый тип функции подтверждения начинается с модификатора asserts
и сопровождается условием, которое мы хотели бы, чтобы функция утверждала. Это условие может быть либо именем одного из входов функции, либо предикатом типа , который сообщает один из входов функции is
более узкого типа, чем объявленный тип. Вот как мы это сделаем с foo()
:
function foo(val: string | number): asserts val is number {
if (typeof (val) !== 'number') {
throw new Error('val must be a number');
}
// do something with number
}
Итак, мы изменили void
на asserts val is number
. Если функция вернется, тип val
будет сужен от string | number
до number
по желанию:
const val: string | number = Math.random() < 0.5 ? "str" : 123;
foo(val);
const x = Math.sqrt(val); // okay
Обратите внимание, что функции утверждений работают только на void
- возвращая функции, поэтому у вас не может быть функции, которая действует как утверждение типа , а возвращает некоторое значение. Есть и другие предупреждения (например, они требуют, чтобы явные аннотации назывались ). Но ваш вопрос настолько идеально подходит для функций утверждения, что, если бы я не знал лучше, я бы подумал, что об этом попросил один из разработчиков языка, чтобы продемонстрировать всю мощь функций утверждения! 10
Хорошо, надеюсь, это поможет; удачи!
Детская площадка ссылка на код