feat(*): add params information to func proptypes where possible#79
feat(*): add params information to func proptypes where possible#79
Conversation
|
@Heymdall если jsdoc не верить - то кому верить? Давай так: |
| } | ||
|
|
||
| const paramsTypes = parsedDoc.params | ||
| .map(p => `${p.name}?: any /*${p.type ? p.type.name : 'any'}*/`); |
There was a problem hiding this comment.
Я бы тут вызывал stringifyType
|
|
||
| function stringifyFunc(type, componentName, propName, description) { | ||
| try { | ||
| if (!description) { |
There was a problem hiding this comment.
можно вынести вверх за try
|
|
||
| ${stringifyDescription(info.description, info.docblock)} | ||
| export default class ${info.displayName} extends Component<${propsInterfaceName}, any> { | ||
| export default class ${info.displayName} extends Component<${propsInterfaceName}> { |
There was a problem hiding this comment.
@Kokatsuna видимо придется обновить реакт дефинишены
|
@stepancar согласен. Поменял немного все, теперь типы делаются из jsdoc-а так же, как и во всех остальных кейсах. |
|
|
||
|
|
||
| export interface AProps { | ||
| readonly optionalArray?: ReadonlyArray<any>; |
There was a problem hiding this comment.
@Heymdall
Если все поля readonly и поднята версия typescript - то не грех и generic утилитой Readonly воспользоваться чтоб читаемым было
There was a problem hiding this comment.
Или даже может стоить рискнуть и написать что-нибудь типа
type DeepReadonly = Readonly<{ [P in keyof T]: T[P] extends Array ? ReadonlyArray<DeepReadonly<T[P][0]>> : DeepReadonly<T[P]> }>;
Правда я думаю, что это еще не совсем корректно работает
There was a problem hiding this comment.
Было бы ништяк еслиб это работало
type DeepReadonly = T extends Array ? ReadonlyArray<DeepReadonly<T[0]>> : Readonly<{ [P in keyof T]: DeepReadonly<T[P]> }>
There was a problem hiding this comment.
@Heymdall Вот этой штукой попробуй обернуть пропс интерфейс.
Вроде работает. Нашел тут
microsoft/TypeScript#13923
There was a problem hiding this comment.
@Heymdall, я тут подумал, что сам интерфейс компонента лучше не делать readonly. Потому что ты можешь ведь динамически набивать проемы, перед тем как передать их компоненту ( не всегда ты можешь хорошо стипизировать литерал). Поэтому важно чтобы только this.props было deepreadonly.
There was a problem hiding this comment.
Фишка в том, что там, где ожидается ридонли можно кинуть обычный, а наоборот - нет.
Ридонли же по сути сабсет обычных типов.
Начал приделывать это изначально именно из-за того что пришлось кастовать ридонли типы из редакс стейта до обычных, когда кидал их в наши компоненты.
Поэтому и захотелось сделать интерфейс компонента ридонли
There was a problem hiding this comment.
А про DeepReadonly согласен, обновил
| } | ||
|
|
||
| const DEPP_READONLY_TYPES = ` | ||
| type Primitive = string | number | boolean | undefined | null; |
There was a problem hiding this comment.
Мне кажется что это можно куда-то засунуть и импортить
There was a problem hiding this comment.
Ну оно как бы можно, но сильно усложняет весь этот процесс. Либо выносить это в отдельную либу, но тогда непонятно как это как зависимость делать. Мы же не привязываемся к конкретной библиотеке тут. Этот код вообще даже не знает куда все это будет записано, надо либо мучаться с относительными импортами тут, либо заставлять пользователей библиотеки ставить как зависимость что-то, что экспортами этот тип. А вот профита от этого никакого нету
There was a problem hiding this comment.
@Heymdall согласен. Может воткнут этот хэлпер в ts.core.
Добавил возможность генерировать более подробные типы для проптайпов-функций.
Получая на вход:
будет генерироваться такое:
Типы проставляются как
any, так как полностью верить jsdoc-ам все же нельзя