Typescript: проверить, было ли возвращено значение определенной функцией?

#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 необязательным, чего я бы не хотел. Здорово, что я теперь знаю, как это называется, спасибо!