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
}
new
? Имхо, это перебор. Не отвалятся у вас руки три лишних символа написать, и это будет куда нагляднее чем непонятные излишние функции.function exportConstruct<P extends any[], T>(classFromExport: { new (...args: P): T; }):
(...args: P) => T {
return (...args) => new classFromExport(...args);
}
function exportCallable<T extends { new (...args: any[]): any; }>(classFromExport: T) {
return new Proxy(classFromExport, {
apply(ctor, _, args) {
return new ctor(...args);
}
}) as T & ((...args: ConstructorParameters<T>) => InstanceType<T>);
}
const Lol = exportCallable(class Lol extends BaseLol {
constructor(public name: string) {
super();
this.name = name.toUpperCase();
}
});
Lol('qwe');
abstract class Newable {
static new<P extends any[], T>(this: { new (...args: P): T; }, ...args: P): T {
return (new this(...args)) as T
}
}
class BaseLol extends Newable { /* ... */ }
class Lol extends BaseLol {
constructor(public name: string) {
super();
this.name = name.toUpperCase();
}
}
Lol.new('qwe');
[ {title: string, cardList: []} ]
- это не массив, заполняемый значениями типа {title: string, cardList: []}
, это кортеж из одного значения данного типа.Array<{title: string, cardList: []}>
или так {title: string, cardList: []}[]
. setTimeout
будет возвращать простой number
, а clearTimeout
будет принимать number | undefined
. И никаких проблем.)window.setTimeout
и window.clearTimeout
. var list = {
'[div]restored': 68,
'[div2]restored': 88,
'[mode]Easy [div]restored': 88,
'[mode]Normal [div]restored': 99
};
Object.entries(list).reduce((acc, [key, value]) => {
const keys = key
.split(/\[(.+?)\]/)
.map(k => k.trim().toLowerCase())
.filter(Boolean)
const last = keys.pop();
keys.reduce(
(sub, key) => sub[key] ?? (sub[key] = {}),
acc
)[last] = value;
return acc;
}, {});
SomeType extends BaseType
для аргумента функции, внутри функции значение этого аргумента просто BaseType
и автоматический вывод исходит из этого. Тут либо добавлять руками оверлоады и на враппер, или пробовать писать головоломный тип, или обойтись без оверлоадов явными условиями типа:type MyFuncAs =<T extends boolean> (obj?: Obj<T>) => T extends false ? number : string;
Grid
сделать тип IGridItemProps
с теми свойствами которые точно нужны для работы Grid
, а в GridItem
наследовать от него уже конкретную реализацию interface GridItemProps extends IGridItemProps { ... }
. Однако это нужно только если теоретически могут появиться ещё GridItemSuper
и GrigItemNice
, если же такого быть не может и модули(компоненты) сами по себе тесно связны, то заморачиваться не стоит. window.location.origin
на origin
целевого сайта. Если к нескольким, то либо заменить на звёздочку(*
), если вам добра не жалко, либо вызывать postMessage
несколько раз подряд, по одному для каждого домена.attachEvent
? Серьёзно? api.get(`files/${id}`, {
responseType: 'blob'
}).then((r) => {
const url = URL.createObjectURL(r.data);
// ...
null
ты должен сделать так, чтобы там не было null
. Довольно очевидно, да.const data = useSelector(state => state.DataState.Data) ?? defaultData;
Либо так:if (favorite && data) {