Гляну за эти атомик и фсд)
Последние вопросы про папку forms и components вообще не понял... Понятное дело, что в проекте будет папка components/user.
я бы конечно начал с того что перестал бы именовать название файлов camelCaseом...
вы как будто мыслите не в рамках компонентного подхода, а в рамках созависимых чанков.
Почемму UserAvatar а не просто Avatar?
Что такое Education и как я должен понять из названия файла что этот файл делает. ответ - никак.
Так же возник вопрос, а что будет если в папку forms положить еще форму?Или в папку components запихать что-то отличное от сущности юзера?
интересно, но всё равно в каждую строку надо дописывать "мусор"
satisfies, к сожалению, не типизирует содержимое, и, например, не работает типизация параметра format и field, когда она функция
export const createTableColumnsBase = <GData>() => {
const columns: Record<string, Column<GData, unknown>> = {}
const getActions = <GColumns>() => ({
add: <K extends string, V>(id: K, column: Column<GData, V>) => {
columns[id] = column as Column<GData, unknown>
return getActions<GColumns & Record<K, Column<GData, V>>>()
},
done: () => columns,
doneTyped: () => columns as GColumns
})
return getActions<unknown>()
}
const defaultColumnParams: Partial<QTableColumn<ProfileEntity>> = {
align: 'left'
}
const columns: QTableColumn<ProfileEntity>[] = [
{ ...defaultColumnParams, name: 'id', label: 'id', field: 'id' },
{ ...defaultColumnParams, name: 'first_name', label: 'Имя', field: 'first_name', sortable: true },
{ ...defaultColumnParams, name: 'last_name', label: 'Фамилия', field: 'last_name', sortable: true, align: 'right' },
]
const columns = ([
{ name: 'id', label: 'id', field: 'id'},
{ name: 'first_name', label: 'Имя', field: 'first_name', sortable: true },
{ name: 'last_name', label: 'Фамилия', field: 'last_name', sortable: true, align: 'right' }
] satisfies QTableColumn<ProfileEntity>[]).map((c): QTableColumn<ProfileEntity> => ({align: 'left', ...c}))
interface SomeDataCreate {
id?: null
[key: string]: unknown
}
interface SomeDataUpdate {
id: number | string
[key: string]: unknown
}
export async function upsert(
path: string,
data: SomeDataCreate | SomeDataUpdate
) {
if (data.id) {
return update(path, data)
} else {
return create(path, data)
}
}
if (data.id && data.id !== "" && data.id !== 0) {
id: never
сделай опциональным, иначе объект этого типа не создашь и не передашь.id: never
у тебя этот самый проп ид подпадает под [propName: string]: unknown
, то есть тоже самое, что: id?: unknown
if (data.id !== undefined) {
return update(path, { id: data.id, ...data })
export async function upsert(
path: string,
data: { id?: never } | { id: number | string }
) {
if (data.id !== undefined) {
return update(path, data)
} else {
return create(path, data)
}
}
interface SomeDataCreate {
name: string
}
interface SomeDataUpdate {
id: number | string
name: string
}
export async function upsert(
path: string,
data: SomeDataCreate | SomeDataUpdate
) {
if ("id" in data) {
return update(path, data)
} else {
return create(path, data)
}
}
а по русски можно? Что такое жс, стайлус, цссом и обезьянка?
напиши как это сделать.
Этот код применяет стиль к тегу, если внутри одного из вложенных тегов есть искомый текст. А как сделать что бы стиль применялся не только к главному, но и всем вложенным тегам? В Stylus достаточно добавить * в конце селектора. А в JS как того же результата добиться?
WSL: Ubuntu в левом нижнем углу продолжает гореть синим.
"window.title": "Not WSL: ${dirty}${activeEditorShort}${separator}${rootName}${separator}${appName}",
"window.title": "${dirty}${activeEditorShort}${separator}${rootName}${separator}${appName}"