У меня (или, скорее, у библиотеки, которую я использую) есть много интерфейсов для различных опций, где много опционально.
interface Options {
a?: number;
b?: number;
c?: number;
}
Я создаю объекты опций, которые собираюсь использовать , но также нужно ссылаться на них сам. Я хочу, чтобы проверка типов выполнялась при создании объекта, но после этого я не хочу, чтобы вещи, которые я не указал, были доступны, или вещи, которые у меня имеют , могут быть неопределенными, как здесь:
const o: Options = { a: 1 } // Good: Object is type checked
o.a.toFixed(0) // Bad: `a` is possibly undefined
Можно просто пропустить тип, но тогда нет проверки типа параметров:
const o = { a: 1, d: 2 } // Bad: `d` isn't an option
o.a.toFixed(0) // Good: `a` is defined
Итак, я создал вспомогательную функцию:
const createOptions = <O extends Options>(options: O): O => options
const o = createOptions({ a: 1 }) // Good: Object is type checked
o.a.toFixed(0) // Good: `a` is defined
Это работает , но необходимость создавать такую функцию для каждого типа опции становится раздражающей и грязной. Можно ли создать для этого единственную вспомогательную функцию generi c?
Моя первая попытка новичка заключалась в следующем, но здесь Typescript требует от меня предоставления 2 типов, а чем просто 1 (Options
), который должен быть необходим.
const create = <T, U extends T>(obj: U): U => obj
const o = create<Options>({ a: 1 }) // Bad: Typescript wants me to specify U
Как я могу написать эту функцию тождества, поэтому мне нужно только указать T
и иметь вывод Typescript U
сам от объекта, в котором я прохожу?
Playground Link