169 похожих чатов

Хочу типизировать семейство объектов с общим типом поля id для

всех, остальные поля для каждого объекта свои. При этом нужно создать независимый тип, в котором так же есть обязательное поле id, а остальные не интересны вообще.

export type ConcreteObject = {id: number, someField: string};
export type IdRequiredObject = {id: number, [key: string]: any};

Попробовал написать как в листинге выше. В том месте, где IdRequiredObject возвращается в результате, а результат принимается в ConcreteObject, ts говорит, что де нет поля someField в твоем IdRequiredObject.


Можно это как-то разрулить?

9 ответов

27 просмотров

Ээ, export interface WithID = { id: number } и принимать на вход его? Конкретные типы образовать по типу export type Something = WithID & { ... }.

Wanna_Phonila- Автор вопроса

да, так можно. Но по смыслу эти типы не связаны между собой и связывать их таким образом, мне кажется странным.

type Id<T extends {}> = T & { id: number } type Book = Id<{ title: string }> type Kek = { uuid: string } type KekWithId = Id<Kek>

Wanna_Phonila- Автор вопроса

Тут такое дело, что мне надо, чтобы Id предполагал наличие любого поля со строковым ключом и любым типом в значении

Id делает из любого твоего типа такой же тип, только с id: number

Wanna_Phonila- Автор вопроса

Ситуация примерно такая type IdRequiredType = { id: number } const commonCreator = (props) => { const genericData: IdRequiredType = getDataDueVar(props.var); return props.children(genericData) } // ################################### type Data = { id: number, content: string } const component = (data: Data) => { return ... } const container = () => { const someVar = ...; return commonCreator({var: someVar, children: component}) } И просто наследовать конкретный тип от базового с ID не подходит, потому что component ожидает не базовый тип, а конкретный. Тут по идее нужен апкаст, но я не очень понимаю, как его сделать. Собственно component не имеет никакого понятия о том, кто его вызывает (и не должен иметь), а в commonCreator может быть отправлен любой компонент с соответсвующим интерфейсом. И, наверно, я мог бы как-то использовать такое interface ICommonCreator { <T>(): T } но, не смотря на пример выше, я пишу на React, там jsx в вызове компонентов. А я не очень понимаю как передать тип внутри jsx(может никак).

как-то непонятно( собери в песочнице пример рабочий, если не лень

Wanna_Phonila- Автор вопроса

ну, немного лениво. Я пока оставил там any везде, чтобы работало =)

https://t.me/ts_cool/146024

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта