#javascript #reactjs #typescript
#javascript #reactjs #typescript
Вопрос:
Например, я хочу сообщить, было ли возвращено значение React useCallback
, которое запоминает функции. Я использую этот хак:
type UseCallback<T extends AnyFunction> = T amp; { __IS_USE_CALLBACK: true };
declare function useCallback<T extends AnyFunction>(
callback: T,
deps: ReadonlyArray<any>,
): UseCallback<T>;
Это позволяет мне делать:
function Component({ foo }: { foo: UseCallback<() => void> }) {}
// Ok
<Component foo={useCallback(() => {}, [])} />
// Error
<Component foo={() => {}} />
Однако использование __IS_USE_CALLBACK
, очевидно, очень хакерское. Кроме того, я не могу использовать тот же подход useMemo
, если это не объект. Есть ли лучший способ определить, было ли возвращено значение определенной функцией?
Комментарии:
1. То, что вы используете, называется «фирменные типы», и это довольно нормально в TS, хотя и немного редко. Более общая вещь, которую вы, кажется, хотите, называется номинальными типами , как в, типы, которые отличаются только по имени (так
UseCallbac<T>
что отличается отT
того, даже если они могут использоваться одинаково). Смотрите здесь . Также называются непрозрачными типами , потому что они не могут быть назначены друг другу. Смотрите Также Этот подход здесь , который является моим личным фаворитом.2. @VLAZ так это то же самое, что и то, что я делаю правильно? Второй подход делает
__IS_USE_CALLBACK
необязательным, чего я бы не хотел. Здорово, что я теперь знаю, как это называется, спасибо!