PropsWithChildren<Props>
. Но под капотом он просто делает так: type PropsWithChildren<P> = P & { children?: ReactNode };
type TwitterProps = {
children: (user: string) => ReactNode
}
const response: ITwitter = ...
. Только если какая-нить хрень прилетит то может сломаться в рантайме, так что либо ты доверяешь серверу, либо используешь какую-нить либу для дополнительной проверки вживую.) forEach
- синхронный. Либо используйте либы умеющие в асинхронный forEach, либо используйте обычные циклы:export const setGenderThunk = (gender, login) => {
return async dispatch => {
const users = await getUsers || []; // там внутри fetch
for(let user of users) {
if(user.login === login) {
const user_ = { ...user, gender: gender };
await setUser(user_, user.id); // там тоже внутри fetch
debugger
if(result.ok) {
dispatch(setGenderAC(user_.gender));
}
}
};
}
}
forEach
отрабатывает всё равно синхрнно, но при этом единовременно плодит множество асинхронных функций выполняющихся параллельно (которых, само собой, никто не ждёт). classes[item]
.for(let item in classes) {
classes[item as keyof typeof classes] = 'page'+item
}
В typescript специально не добавили автоматическую типизацию ключей оставив просто string
, так как из-за его структурной природы нельзя наверняка сказать, есть ли в полученном объекте(или его прототипе) ещё какие-то ключи, кроме тех, что указаны в его типе, и, соответственно, нельзя быть уверенным, что ничего не сломается. map
складывает в выходной массив результат переданной функции. Поскольку она у вас возвращает отфильтрованный массив items
, то в итоге у вас получается массив массивов items
. Если вам нужно, чтоб возвращались категории - возвращайте категории.reduce
: сonst filterData = filter(arr, input.value);
interface Category {
category: string;
list: Array<{
item: string;
}>;
}
function filter<T extends Category>(data: T[], value: string): T[] {
if (!value) return data.slice(); // или [] если при пустом value нужен пустой массив
value = value.toLowerCase();
return data.reduce((result, category) => {
if(category.category.toLowerCase().includes(value)) {
result.push(category);
} else {
const list = category.list.filter(({ item }) => item.toLowerCase().includes(value));
if (list.length) {
result.push({
...category,
list
});
}
}
return result;
}, [] as T[])
}
"proxy": "http://localhost:8000",
в package.json
) localStorage
хранятся только строки. Если вы делаете так localStorage.setItem('token', false)
, то при localStorage.getItem('token')
вы получаете не ''
, а результат приведения false
к строке, т.е. 'false'.
false !== ''
- тоже истина, потому что !==
сравнение без приведения типов. buttonClickHandler = id => {
const delay = randomTime();
setTimeout(() => {
this.setState({
array: [
...this.state.array,
`${asd()} Button ${id} was pressed with ${delay}s timeout`
]
}); // распаковываю массив array из стейта и добавляю "Нажата кнопка"
}, delay * 1000);
};
e.stopPropagation
- можно заюзать e.stopImmediatePropagation
. :)declare module '*.scss' {
const scss: any;
export default scss
}
, чтоб он знал какие там где типы.Uncaught SyntaxError: Unexpected token '<',
говорит что вместо скрипта тебе грузится html.