по присвоенному типу
Я намеренно сделал ошибку в инициализации массива data, чтобы проверить корректность присвоенного типа, т.к. TS поругался, значит данный тип гарантирует что value всегда равен props.value, а значит функция Render может без проблем принимать value в props.value, и ошибок в рантайме никогда не произойдет. Но при вызове функции Render, TS приводит тип props.value к типу string & number & string[] & number[], следовательно к типу never, а тип value остается string | number | string[] | number[] и возникает ошибка несоответствия. И это фиксится только через as any/as never?
Каст к never будет безопасен, если вы будете уверены, что приходящие данные всегда консистентного типа. Сейчас это не так, у вас тип value и тип аргумента value в функции Render совпадают, с точки зрения тайпскрипта, по чистой случайности. Проставленные вами типы никак не препятствуют им быть разных типов. Исправьте это, и можете быть уверены в совпадении типов: type DataValue = string | number | string[] | number[]; type IDatum<T extends DataValue> = { label: string, value: T, Render?: ((props: { label: string, value: T }) => void)}; type IData = IDatum<string> | IDatum<number> | IDatum<string[]> | IDatum<number[]>;
Обсуждают сегодня