В целом, подозреваю, что имеет место баг.
type CheckWithError<N extends number> = N extends 0 ? N : N & [error: 'invalid value'];
type Check<N extends number, Tpl> = `${N}` extends Tpl ? N : `Value have to be between -90 and 90!`;
Argument of type 'number' is not assignable to parameter of type 'never'.
Argument of type '90.00001' is not assignable to parameter of type '"Value have to be between -90 and 90!"'.
Но я тут ещё раз погуглил немного и, кажись, понял возможную причину.
{}
— это, по сути, алиас другого типа:Object
(с большой буквы), а поскольку всё наследуется отObject
(кроме нулл и андефайнд), то и присвоить можно любое значение. А присвоить его можно любому значению, потому что по сути этоRecord<any, any>
со всеми вытекающими.Все остальные типы расширяют базовый объект, а объекты наследуются от него напрямую и из-за этого банальная проверка на тип не работает.
Как-то так, если я всё правильно понял.