Size: a a a

2021 March 11

КС

Кирилл Спасибович... in Svelte [svelt]
type setFunc = (value: T) => void;     ■ Cannot find name 'T'.

export const users = writable<User[]>([], (set: setFunc) => {
 fetchRest('/api/users').then(set);
});

кто-то в ts'е баловался с инициализацией стора через функцию и обозначением типа параметра set ? оно же .set метод стора

https://github.com/sveltejs/svelte/blob/ce3a5791258ec6ecf8c1ea022cb871afe805a45c/src/runtime/store/index.ts#L29-L41

тут оно как-то так и описано
источник
2021 March 12

М

Максим in Svelte [svelt]
E M
я делал. примерно в 2005
когда дебажили через алерт? )))
источник

EM

E M in Svelte [svelt]
Максим
когда дебажили через алерт? )))
честно, зачем уже не помню, помню что был eval
источник

AP

Alexander Ponomarev in Svelte [svelt]
попробовал сделать пакет на тайпскрипте:
1. применил препроцесс - получил *.svelte файлы с скриптом на жсе.
2. сгенерировал *.d.ts файл к каждому *.svelte файлу
3. положил все в папку нод модулей аппа
4. в приложении импортнул в какой-нибудь *.svelte файл со скриптом lang="ts" файл из пакета
5. передаю невалидные аргументы в компонент и запускаю svelt-check.
6. не получаю никаких ошибок.

замечательная поддержка тайпскрипта
источник

К

Константин in Svelte [svelt]
Максим
когда дебажили через алерт? )))
у нас специальная функция была написана, которая первый уровень объектов разворачивала для консоли. Когда консоль ещё объекты не отображала в браузерах
источник

К

Константин in Svelte [svelt]
это был 2011 и ИЕ в основном
источник

DK

Dan Kozlov in Svelte [svelt]
Кирилл Спасибович
type setFunc = (value: T) => void;     ■ Cannot find name 'T'.

export const users = writable<User[]>([], (set: setFunc) => {
 fetchRest('/api/users').then(set);
});

кто-то в ts'е баловался с инициализацией стора через функцию и обозначением типа параметра set ? оно же .set метод стора

https://github.com/sveltejs/svelte/blob/ce3a5791258ec6ecf8c1ea022cb871afe805a45c/src/runtime/store/index.ts#L29-L41

тут оно как-то так и описано
Тебе ж дженерик надо на setFunc объявить, оно тебе об этом и говорит.

А разве нельзя забрать тип через Writable['set']?
источник

КС

Кирилл Спасибович... in Svelte [svelt]
Dan Kozlov
Тебе ж дженерик надо на setFunc объявить, оно тебе об этом и говорит.

А разве нельзя забрать тип через Writable['set']?
не пробовал, спс
а как ты  сторы с функциями описывал ?
источник

КС

Кирилл Спасибович... in Svelte [svelt]
startStop вот это всё
источник

DK

Dan Kozlov in Svelte [svelt]
Не имею сторов с функциями, но так же, как с любыми другими данными :)
const store = writable<null | (() => void)>(null)
источник

КС

Кирилл Спасибович... in Svelte [svelt]
export const users = reloadable<User[]>([], (set: (value: User[]) => void) => {
 fetchRest('/api/users').then(set);
});

я имею ввиду такое
источник

КС

Кирилл Спасибович... in Svelte [svelt]
где на подписке у тебя функция
источник

DK

Dan Kozlov in Svelte [svelt]
Кирилл Спасибович
export const users = reloadable<User[]>([], (set: (value: User[]) => void) => {
 fetchRest('/api/users').then(set);
});

я имею ввиду такое
Это ты что-то свое написал или опечатался и там readable?

В любом случае, типизировать руками сет-аргумент в случае с встроенными сторами не надо, оно ж все и так описано.
А если у тебя кастом, тогда доопиши функцию из первого сообщения, надо просто дженерик объявить. type setFunc = <T>(value: T) => void
источник

КС

Кирилл Спасибович... in Svelte [svelt]
дыа.. у меня что-то своё:

import { writable, Writable } from 'svelte/store';

/** Callback to inform of a value updates. */
type Subscriber<T> = (value: T) => void;

/** Unsubscribes from value updates. */
type Unsubscriber = () => void;

/** Start and stop notification callbacks. */
type StartStopNotifier<T> = (set: Subscriber<T>) => Unsubscriber | void;

interface ReloadableFactory {
 reloadable<T>(
   value: T,
   startStopNotifier?: StartStopNotifier<T>
 ): Reloadable<T>;
 reload: () => void;
 preload: () => () => void;
}

interface Reloadable<T> extends Writable<T> {
 reload: () => void;
}

export function reloadableStore(): ReloadableFactory {
 const stores: Reloadable<unknown>[] = [];

 function reloadable<T>(
   value: T,
   onSubscribe: StartStopNotifier<T>
 ): Reloadable<T> {
   if (!onSubscribe)
     onSubscribe = (set: (value: T) => void) => {
       set(value);
     };
   const { set, update, subscribe } = writable<T>(value, onSubscribe);
   const reload: () => void = () => onSubscribe(set);
   const store = { set, update, subscribe, reload };
   stores.push(store);
   return store;
 }

 function preload(): Unsubscriber {
   const unsubs = stores.map((store: Reloadable<unknown>) =>
     // eslint-disable-next-line @typescript-eslint/no-empty-function
     store.subscribe(() => {})
   );
   return () => unsubs.forEach((unsub: Unsubscriber) => unsub());
 }

 function reload(): void {
   stores.forEach((store: Reloadable<unknown>) => store.reload());
 }

 return { reloadable, reload, preload };
}
источник

КС

Кирилл Спасибович... in Svelte [svelt]
пришлось типов понадёргать
источник

КС

Кирилл Спасибович... in Svelte [svelt]
из свелтовского стора
источник

КС

Кирилл Спасибович... in Svelte [svelt]
хотя можно было и свои аналогичные написать наверное
источник

КС

Кирилл Спасибович... in Svelte [svelt]
без Александра бы не справился, сложна чото
источник

КС

Кирилл Спасибович... in Svelte [svelt]
@dkzlv а ты делал какие-то тесты на jest'е или чето подобное ? или только тс ?
источник

DK

Dan Kozlov in Svelte [svelt]
Кирилл Спасибович
дыа.. у меня что-то своё:

import { writable, Writable } from 'svelte/store';

/** Callback to inform of a value updates. */
type Subscriber<T> = (value: T) => void;

/** Unsubscribes from value updates. */
type Unsubscriber = () => void;

/** Start and stop notification callbacks. */
type StartStopNotifier<T> = (set: Subscriber<T>) => Unsubscriber | void;

interface ReloadableFactory {
 reloadable<T>(
   value: T,
   startStopNotifier?: StartStopNotifier<T>
 ): Reloadable<T>;
 reload: () => void;
 preload: () => () => void;
}

interface Reloadable<T> extends Writable<T> {
 reload: () => void;
}

export function reloadableStore(): ReloadableFactory {
 const stores: Reloadable<unknown>[] = [];

 function reloadable<T>(
   value: T,
   onSubscribe: StartStopNotifier<T>
 ): Reloadable<T> {
   if (!onSubscribe)
     onSubscribe = (set: (value: T) => void) => {
       set(value);
     };
   const { set, update, subscribe } = writable<T>(value, onSubscribe);
   const reload: () => void = () => onSubscribe(set);
   const store = { set, update, subscribe, reload };
   stores.push(store);
   return store;
 }

 function preload(): Unsubscriber {
   const unsubs = stores.map((store: Reloadable<unknown>) =>
     // eslint-disable-next-line @typescript-eslint/no-empty-function
     store.subscribe(() => {})
   );
   return () => unsubs.forEach((unsub: Unsubscriber) => unsub());
 }

 function reload(): void {
   stores.forEach((store: Reloadable<unknown>) => store.reload());
 }

 return { reloadable, reload, preload };
}
Массивно и запарно! :)
Не претендую на истину, но проще б было, наверное, сделать враппер-функцию, в не пытаться расширять сторы.
composition over inheritance и все такое. У тебя и типов бы вообще не было по сути.
источник