constructor(field1, field2) {
this.field1 = field1;
this.field2 = field2;
}
поля будут вставлены сразу после super()
если он есть или в начало конструктора, если super()
нет node
class Base<T> {
protected val: T;
}
class A extends Base<string> {
methodA(): string {
return this.val; // Ok, так как здесь val имеет тип string
}
}
class B extends Base<number> {
methodB(): number {
return this.val; // тоже ok, так как здесь val имеет тип number
}
}
type Keplr = {
enable(chainId: ChainId): Enable;
};
const isInstalled = (v: unknown): v is Keplr => !!(window.getOfflineSigner && v)
const enable = () => {
if (isInstalled(window.keplr)) return window.keplr.enable(chainId)
}
type Char = "A" | "B" | "C" | "D";
type ConcatMap<T> = T extends unknown
? {} extends T[keyof T]
? `${string & keyof T}`
: `${string & keyof T}${ConcatMap<T[keyof T]>}`
: never;
type MapChars<C extends Char> = {
[K in C]: MapChars<Exclude<C, K>>
};
type Split<S extends string> = S extends `${infer H}${infer Tail}`
? [H, ...Split<Tail>]
: [];
type T1 = Split<T2>;
type T2 = ConcatMap<MapChars<Char>>;
type Split<S extends string, D extends string = ''> = S extends ''
? []
: S extends `${infer H0}${D}${infer H1}${D}${infer H2}${D}${infer H3}${D}${infer H4}${D}${infer H5}${D}${infer Tail}`
? [H0, H1, H2, H3, H4, H5, ...Split<Tail, D>]
: S extends `${infer H0}${D}${infer H1}${D}${infer H2}${D}${infer H3}${D}${infer Tail}`
? [H0, H1, H2, H3, ...Split<Tail, D>]
: S extends `${infer H0}${D}${infer Tail}`
? [H0, ...Split<Tail, D>]
: never;
@Controller()
@Get('/dashboard')
@Render ('dashboard')
async getDashboard () {
const sites = await this.usersSitesService.selectSitesByUserId(1);
return { sites };
}
Какой смысл в тайпскрипте, если писатьselectSitesByUserId = async (id: number): Promise<any>
any
?Репо с докой router-controller https://github-com.translate.goog/typestack/routin...Ссылка на машинный перевод? Вы это серьезно?
Подскажите пожалуйста, стоит ли явно определять тип переменной или нет?В большинстве случаев нет, лучше доверится выводу типов, он сделает это лучше.
есть, так как ts знает, что const нельзя переприсвоить, а числа неизменяемый тип, он выведет тут литеральный тип 10, который без проблем можно передать как в number так и в union из литеральных типов содержащий в себе 10const a: number = 10;
Есть ли вообще какие то отличия?
// где-то есть
type SomeObject = { /* ... */ };
function getSomeObject(): SomeObject { /* ... */ }
// без явной декларации будет выведен тип null
let v: SomeObject | null = null;
setTimeout(() => {
// без явной декларации типа для v здесь будет ошибка
v = getSomeObject();
});
type EventData = {
event: Parameters<typeof thumbHandler>[0];
};
const handleThumbEnd = (eventData: EventData) => thumbHandler(eventData.event, true);
const handleThumbMove = useThrottledFn(
(eventData: EventData) => thumbHandler(eventData.event),
250,
);
const handlers = useSwipeable({
onSwiping: handleThumbMove,
onSwiped: handleThumbEnd,
preventDefaultTouchmoveEvent: true,
trackMouse: true,
trackTouch: true,
});
или так:type HandlerMove = Parameters<typeof useSwipeable>[0]['onSwiping'];
type HandlerEnd = Parameters<typeof useSwipeable>[0]['onSwiped'];
const handleThumbEnd: HandlerMove = (eventData) => thumbHandler(eventData.event, true);
const handleThumbMove: HandlerEnd = useThrottledFn(
(eventData) => thumbHandler(eventData.event),
250,
);
const handlers = useSwipeable({
onSwiping: handleThumbMove,
onSwiped: handleThumbEnd,
preventDefaultTouchmoveEvent: true,
trackMouse: true,
trackTouch: true,
});
или так type CreatureBasis = {
People: {
child: {
age: number;
school: string;
};
adult: {
age: number;
height: number;
weight: number;
};
};
Animal: {
fish: {
waterBody: string;
};
cat: {
catchMouses: boolean;
};
};
};
type Creature = {
[K0 in keyof CreatureBasis]: {
[K1 in keyof CreatureBasis[K0]]: {
type: K0;
subtype: K1;
params: CreatureBasis[K0][K1];
};
}[keyof CreatureBasis[K0]];
}[keyof CreatureBasis];
const interval = useRef(null);
// ...
interval.current = setInterval(//...
// хелперы
const makeCustomTextFieldWithState = (): [string, ReactElement] => {
const [value, setValue] = useState<string>('');
const onChange = (event: React.ChangeEvent<HTMLInputElement>) =>
setValue(event.target.value);
return [value, <CustomTextField onChange={onChange} />];
};
const makeManyCustomTextFieldWithState = (count: number): [string[], ReactElement[]] =>
Array(count).fill(0).reduce(([values, elements]) => {
const [value, element] = makeCustomTextFieldWithState();
return [
[...values, value],
[...elements, element],
];
}, [[], []]);
// в компоненте
const [[dept, login, firstName, lastName], elements] = makeManyCustomTextFieldWithState(4);
<>{elements}</>