merhaba arkadaşlar;
not: Başlığa ne koyacağımı bilemedim. Yetkili arkadaşlar düzenleyebilir
Astro ile svelteye props olarak closure verince hata veriyor
Aynı şeyi svelte-kit vs ile yapınca sorun olmuyordu
closerların tipi bu
type ConvertFn<T> = (item: T) => unknown[]
type RestoreFn<T> = (row: unknown[]) => T
propsları tanımladığım interface bu
interface $$Props {
class?: string
options?: {
columns?: {
label?: string | undefined
width?: string | undefined
}[]
}
data: T[]
hasConversion?: {
convert: ConvertFn<T>
restore: RestoreFn<T>
}
}
generic T datadaki elemanların tipi
export let data: $$Props['data']
// default conversion if not provided by props
export let hasConversion: $$Props['hasConversion'] = {
convert: (item) => Object.values(item as object),
restore: (items: unknown[]) =>
(Object.keys(
data[0] as object
) as string[])
.reduce((v,c, i) =>
({[c]: items[i], ...v}), {}) as unknown as T
}
componente closureları props geçersem closureların tipi object
olarak geliyor. Eğer geçmezsem Function
alıyorum. Garip bir şekilde hata versede component render ediliyor
closureları burda objeyı tablo stunlarına map etmek için kullanıyorum
<tbody class="border border-1 border-gray-500">
{#each data as item}
<Row>
{#each hasConversion && hasConversion.convert(item) || [] as cell}
<Cell data={cell} />
{/each}
</Row>
{/each}
</tbody>
tabloyuda bu şekilde kullanmaya çalışıyorum
<Table
client:load
class="mt-8"
hasConversion={{
convert: tableColConverter
}}
data={tableData}
options={tableOptions} />
function tableColConverter (x) {
return [x.id, x.product, x.code, x.price];
}
typelardada sıkıntı yok gibi, playgroundda çalışıyor
Playground
verdiğim bazı arkadaşlara yetmeyecek buda komponentin repl linki https://svelte.dev/repl/a494b25841df4c189817b152464469a8?version=4.2.16
edit: Component interactive olmadan önce metoda ulaşmaya çalıştığı için hata veriyormuş. Astroya özel bir durum yani
// default conversion if not provided by props
export let hasConversion: $$Props['hasConversion']
onMount(()=> {
converter = hasConversion?.convert || ((item) => Object.values(item as object))
restorer = hasConversion?.restore || ((items: unknown[]) =>
(Object.keys(
data[0] as object
) as string[])
.reduce((v,c, i) =>
({[c]: items[i], ...v}), {}) as unknown as T)
})
let converter: ConvertFn<T>
let restorer: RestoreFn<T>
{#if converter}
{#each data as item}
<Row>
{#each converter(item) || [] as cell}
<Cell data={cell} />
{/each}
</Row>
{/each}
{/if}
su sekilde düzenleyince sorun çözüldü