MouseEventHandler
переводится как KeyboardEventHandler
как что? Правильно, "обработчик событий клавиатуры". MouseEvent
/KeyboardEvent
)? Да не, бред какой-то.getCity
таки имеет такой тип. И куда же мы передаём этот getCity
? А передаём мы его в onSubmit
. Скажи же мне, друже, submit
- это событие клавиатуры? Или может быть это событие мыши? Ты уверен? Вот и мне кажется что нет. о какой рендер функции идет речь?
<template>
.(под капотом <template>
компилируется в render-функцию)setup
, можно класть в свойство render
.script setup,
можно сделать так:<template>
<div>
<render/>
</div>
</template>
<script setup lang="ts">
import { h, useSlots } from 'vue'
const slots = useSlots();
const render = () => {
return h('div', slots.default());
};
</script>
BehaviorSubject
не стоит, не одному тебе потом с ним работать.class DistinctBehaviorSubject<T> extends BehaviorSubject<T> {
next(value: T) {
if (this.value !== value)
super.next(value);
}
}
Но я на вскидку не скажу какие тут могут быть подводные камни.) function doSomething(param: string, value: unknown) {
console.log('doSomething', param, value);
}
function WebworkerParam(param: string){
return (target: any, key: PropertyKey) => {
let subscription: Subscription;
let innerValue: any;
Object.defineProperty(target, key, {
get() {
return innerValue;
},
set(value) {
if (subscription)
subscription.unsubscribe();
if(value instanceof BehaviorSubject)
subscription = value.subscribe(newValue => doSomething(param, newValue));
else
doSomething(param, value);
innerValue = value;
}
})
}
}
type MethodNames<T extends string> = `get${T}s` | `create${T}` | `get${T}`;
interface IAPI {
new <T extends string>(type: T, url: string): {
[K in MethodNames<T>]: Function
}
}
export default API as unknown as IAPI;
сработает как надо. Естественно ты можешь доработать интерфейс IAPI до полного совпадения.type MethodNames<T extends string> = `get${T}s` | `create${T}` | `get${T}`;
class API {
[key: MethodNames<string>]: Function
_url;
constructor(type: string, url: string) {
this._url = url;
this[`get${type}s`] = this._readMany;
this[`create${type}`] = this._create;
this[`get${type}`] = this._read;
}
_readMany(params = {}) {
const options = getApiOptions(Method.GET);
const url = new URL(this._url);
url.search = new URLSearchParams(params);
return fetch(url.toString(), options);
}
_create(body) {
const options = getApiOptions(Method.POST, body);
return fetch(this._url, options);
}
_read(id) {
const options = getApiOptions(Method.GET);
return fetch(`${this._url}/{id}`, options);
}
}
Date
не может быть children'ом для компонента, и это так. Однако дело в том, что тип у тебя задан неверно, на самом деле у тебя там никакой не Date
а банальный string
. Если ты поправишь типы, то всё заработает и выведет тебе то что ты передаёшь, т.е. 2012-03-23T08:25:44.962Z
.2012-03-23T08:25:44.962Z
в строку Created 7 years ago
надо либо руками написать соответствующую функцию, либо воспользоваться какой-либо библиотекой для работы с датами. Например с помощью moment
это будет выглядеть примерно так:const createdFromNow = `Created ${
moment.duration(moment().diff(data.createdAt)).humanize()
} ago`;
А ещё динамическая типизация сильно экономит время на написание кода - это очень нехилая оптимизация рабочего процесса.
interface DefaultProps4 {
instantPopoup?: boolean;
// ...
}
interface PropsWithCb4 extends DefaultProps4 {
cb(): void;
}
interface PropsWithPath4 extends DefaultProps4 {
path: string;
}
type Magic = ((arg: PropsWithCb4) => 1) & ((arg: PropsWithPath4) => 2);
declare const magic: Magic;
// error
magic({
cb: () => {},
instantPopoup: true,
path: "df",
});
// 1, no error
magic({
cb: () => {},
instantPopoup: true,
})
// 2, no error
magic({
instantPopoup: true,
path: "df",
})
const trololo = {
cb: () => {},
instantPopoup: true,
path: "df",
}
magic(trololo); // 1, no error
null
(потому что именно такое значение по умолчанию ты передал).export const Context = createContext<{
sidebarIsOpen: boolean;
toggleSidebar: (value: boolean) => void;
} | null>(null)
или лучше export const Context = createContext({
sidebarIsOpen: false,
toggleSidebar: () => {}
});