Как избежать постоянного повторения типов при использовании обобщений в Typescript? Если у меня есть какое-то ограничение на тип generi c, я должен повторить это ограничение везде, где я использую тип generi c. Это утомительно и не очень. Теперь, если я хочу использовать свой тип generi c в других местах, мне также нужно повторить ограничение!
const makeGenericOne2: <T extends MyConstraint>(arg: GenericOne<T>) => GenericOne<T> = (arg) => {
return arg
}
По крайней мере, теперь я могу создавать из объектных литералов, не повторяя себя
const test5 = makeGenericOne2({ foo: { bar: 1 } })
// And I get nice error messsages
const test6 = makeGenericOne2({foo: {baz: 1}})
Единственный способ избежать повторения ограничения - это условный тип с выводом
const makeGenericOne: <T>(arg: T extends GenericOne<infer U> ? T : never) => T = (arg) => {
return arg
}
Я все еще могу создавать экземпляры из литерала объекта, не повторяя себя
const test3 = makeGenericOne({ foo: { bar: 1 } })
Но теперь сообщения об ошибках не такие приятные.
//"number not assignable to never" instead of { baz: 1 } is missing property "bar: number"
const test4 = makeGenericOne({ foo: { baz: 1 } })
Похоже, что необходимо следующее - вывести T, потому что мы знаем, что он должен расширять Myconstraint
const propagateGeneric: <infer T>(arg: GenericOne<T>) => GenericOne<T>
К сожалению, в настоящее время это запрещено в TS.
Как мне «распространить» ограничение на тип generi c, чтобы избежать его повторов везде, где используется тип generi c?
Sandbox Link