Как избежать повторения ограничений типа generi c при каждом использовании в Typescript? - PullRequest
0 голосов
/ 29 мая 2020

Как избежать постоянного повторения типов при использовании обобщений в 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

1 Ответ

0 голосов
/ 29 мая 2020

Сложно, но вроде работает

//A constraint on this generic
type MyConstraint = { bar: number }
type GenericOne<T extends MyConstraint = MyConstraint> = {
    foo: T
}
...