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
. 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
, если же такого быть не может и модули(компоненты) сами по себе тесно связны, то заморачиваться не стоит. null
ты должен сделать так, чтобы там не было null
. Довольно очевидно, да.const data = useSelector(state => state.DataState.Data) ?? defaultData;
Либо так:if (favorite && data) {
const RunOutsideAngular = (target: any, memberName: string) => {
const method = target[memberName];
return Object.defineProperty(target, memberName, {
writable: true,
configurable: true,
value(...args: any[]) {
return this.ngZone.runOutsideAngular(method.bind(this, ...args))
}
});
};
const RunOutsideAngularAll = (constructor: Function) => {
const keys = new Set<string>();
let proto = constructor.prototype;
do {
if(proto === Object.prototype) break;
Object.getOwnPropertyNames(proto).forEach(
key => typeof proto[key] === 'function'
&& key !== 'constructor'
&& keys.add(key)
);
} while (
proto = Object.getPrototypeOf(proto)
);
keys.forEach(key => RunOutsideAngular(constructor.prototype, key));
}
class SomeClass {
@RunOutsideAngular
myFunc() {
mycode.....
}
}
// или
@RunOutsideAngularAll
class SomeClass {
myFunc() {
mycode.....
}
}
RunOutsideAngular
- по-хорошему надо типизировать дженериком под ангуляр.RunOutsideAngularAll
- обрабатывает все методы и функции, в т.ч. унаследованные, можно упростить чтоб работал только с методами текущего класса. type
будет строго одно из "direct" | "fanout" | "headers" | "topic"
, а получает просто string
.return (await this.rascal.create(RascalConfig as BrokerConfig))
Но это чревато ошибками в самом конфиге.const RascalConfig: BrokerConfig = { ... }
const RascalConfig = { ... } as const
let routes = await axios(...)
.then((response: AxiosResponse<Route[]>) => response.data)
.catch(console.log);
Нет смысла гонять из пустого в порожнее.