view
кроме labled
? Props
, можно предположить, что это какие-то props какого-то React компонента, тогда этого можно добиться с помощью перегрузки:export interface ModalProps extends CuiModalProps {
children: ReactElement | ReactElement[]
setterClosePopup: Dispatch<SetStateAction<boolean>>
namePopup?: string
isOpen?: boolean
withBorder?: boolean
className?: string
}
export interface ModalPropsLabled extends ModalProps {
view: 'labeled'
label: string
}
export const Component: ((pros: ModalProps) => ReactNode) & ((pros: ModalPropsLabled) => ReactNode) = (pros: ModalProps | ModalPropsLabled) => { ... }
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;