Я не думаю, что он должен был использоваться так, как вы его используете - в основном infer
следует использовать для того, чтобы "вывести" (или решить, может быть, лучшее именование?) Тип, чаще всего из обобщенного c.
То, как вы его используете, вы создаете тип, который не имеет никакой части «dynamici c» (в основном это не generi c), то есть он всегда один и тот же, и, следовательно, выводит от чего-то, что всегда одинаково, не имеет смысла. Потому что во время компиляции вы уже знаете, что Types
распространяется только на Types & '...anything else'
, и поскольку вы не можете определить эту другую часть в вашем MyExperimentsUnion
типе, infer
не имеет особого смысла.
Пример использования
interface Action<T> {
payload: T
}
type ExtractGeneric<T> = T extends Action<infer X> ? X : never
function getPayload<T extends Action<any>>(action: T): ExtractGeneric<T> {
return action.payload;
}
const myAction = { payload: 'Test' };
const myPayloadWithResolvedType = getPayload(myAction);
В приведенном выше примере myPayloadWithResolvedType
будет иметь string
в качестве разрешенного типа, потому что, если вы не используете infer
, вам придется передать этот возвращаемый тип как Второй параметр, вероятно, так:
function getPayloadNonExtract<T extends Action<U>, U>(action: T): U {
return action.payload;
}
Здесь - ссылка на игровую площадку.
Приветствия.