update
, а родитель его поймал и что-то сделал.provide
, дети делают inject
и таким образом держат общий набор данных\методов.ref
тоже можно, но тут следует продумать архитектуру с публичными и внутренними методами, чтоб поддержка не превратилась в ад. function wrapper<T extends { start(...args: unknown[]): unknown }>(target: { new(): T }, ...args: Parameters<T['start']>): T {
let instance = new target();
instance.start(...args);
return instance;
}
class RandomClass {
start(arg1: string, arg2: number) { /* ... */ }
}
let instance = wrapper(RandomClass, 'Hello, world!', 777); /// все ок
let instance2 = wrapper(RandomClass, 777); /// ошибка
data binding
, которая будет заботится о таких вещах за тебя. Мне лично нравится Vue
, но есть и множество решений по-проще и по-традиционней.value
: const valueDescriptor = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value');
Object.defineProperty(two, 'value', {
...valueDescriptor,
set(value) {
valueDescriptor.set.call(this, value);
this.dispatchEvent(new Event('input', {
bubbles: true,
cancelable: true,
}));
}
})
p
на span
или выбирать не сам тег, а его содержимое: selectNode
-> selectNodeContents
. type TupleUnion<U extends string, R extends string[] = []> = {
[S in U]: Exclude<U, S> extends never ? [...R, S] : TupleUnion<Exclude<U, S>, [...R, S]>;
}[U] & string[];
interface Interface {
foo: boolean;
bar: string;
baz: object
}
type Keys = TupleUnion<keyof Interface>;
let keys: Keys;
keys = ['foo', 'bar', 'baz']; // OK все ключи указаны
keys = ['foo']; // NOT OK указаны не все ключи
keys = ['foo', 'bar', 'another bar']; // NOT OK один из ключей не совпадает
<foldet-block
v-bind:anchor="'показать'"
v-bind:anchor_show="'скрыть'"
><template v-slot><p>{{text}}</p></template></foldet-block>