MouseEventHandler
переводится как KeyboardEventHandler
как что? Правильно, "обработчик событий клавиатуры". MouseEvent
/KeyboardEvent
)? Да не, бред какой-то.getCity
таки имеет такой тип. И куда же мы передаём этот getCity
? А передаём мы его в onSubmit
. Скажи же мне, друже, submit
- это событие клавиатуры? Или может быть это событие мыши? Ты уверен? Вот и мне кажется что нет. root.render(
<Header/>
);
<script src="index.js" type="module"></script>
import Header from './Header.js';
const domContainer = document.querySelector('#container');
const root = ReactDOM.createRoot(domContainer);
root.render(
React.createElement(Header)
);
function Header() {
return React.createElement('div', null, 'hsas')
}
export default Header;
Date
не может быть children'ом для компонента, и это так. Однако дело в том, что тип у тебя задан неверно, на самом деле у тебя там никакой не Date
а банальный string
. Если ты поправишь типы, то всё заработает и выведет тебе то что ты передаёшь, т.е. 2012-03-23T08:25:44.962Z
.2012-03-23T08:25:44.962Z
в строку Created 7 years ago
надо либо руками написать соответствующую функцию, либо воспользоваться какой-либо библиотекой для работы с датами. Например с помощью moment
это будет выглядеть примерно так:const createdFromNow = `Created ${
moment.duration(moment().diff(data.createdAt)).humanize()
} ago`;
moment.updateLocale('uz-latn', {
relativeTime: {
past: '%s oldin'
}
});
moment.defineLocale('uz-latn-short', {
parentLocale: 'uz-latn',
relativeTime: {
past: '%s oldin'
}
});
и используешь её где надо. null
(потому что именно такое значение по умолчанию ты передал).export const Context = createContext<{
sidebarIsOpen: boolean;
toggleSidebar: (value: boolean) => void;
} | null>(null)
или лучше export const Context = createContext({
sidebarIsOpen: false,
toggleSidebar: () => {}
});
json
, лучше тыкнуть в консоли на ответе "Copy object" и вставь в любой конвертер, который гуглится по "json to ts", например https://app.quicktype.io/. Так ты точно не ошибёшься, а потом уже можешь уточнить тип руками. unknown
и прогонять через тайпгард, проверяя руками, что он соответствует типу, но это не частая практика, увы. React.ComponentPropsWithRef<'select'>
находится свойство, которое дженерик Option
в Select
устанавливает как string | number
с большим приоритетом, чем то что ты кладёшь собственно в Options
. Можешь поискать сам убирая по одному или сравнивая с декларацией для Select
.React.ComponentPropsWithRef<'select'>
, т.к. ты расширяешь не нативный select
, а react-select
.import Select, { Props } from 'react-select';
interface ISelectProps extends Props<OptionType> {
caption?: string;
disabled?: boolean
}
[ {title: string, cardList: []} ]
- это не массив, заполняемый значениями типа {title: string, cardList: []}
, это кортеж из одного значения данного типа.Array<{title: string, cardList: []}>
или так {title: string, cardList: []}[]
. setTimeout
будет возвращать простой number
, а clearTimeout
будет принимать number | undefined
. И никаких проблем.)window.setTimeout
и window.clearTimeout
. Grid
сделать тип IGridItemProps
с теми свойствами которые точно нужны для работы Grid
, а в GridItem
наследовать от него уже конкретную реализацию interface GridItemProps extends IGridItemProps { ... }
. Однако это нужно только если теоретически могут появиться ещё GridItemSuper
и GrigItemNice
, если же такого быть не может и модули(компоненты) сами по себе тесно связны, то заморачиваться не стоит.