适配Svelte虚拟列表到TypeScript时,如何指定Item的类型?
解决Svelte虚拟列表TypeScript类型匹配问题
你遇到的问题是因为better-svelte-virtual-list的let:item在TS中被默认推断为{}类型,无法匹配BookRowEntry要求的BookClass类型,以下是几种可行的解决方法:
方法1:给VirtualList指定泛型类型
如果组件支持泛型,直接在使用时声明items的类型:
<VirtualList<BookClass> items={books} {itemHeight} {containerHeight} {scrollTop} let:item let:dummy let:y> <div class="book" class:dummy style="top:{y}px;"> {#if !dummy} <BookRowEntry {item} /> {/if} </div> </VirtualList>
这样TS会自动推断item为BookClass类型,无需额外断言。
方法2:手动类型断言item
如果组件不支持泛型,直接对item进行类型断言:
{#if !dummy} <BookRowEntry item={item as BookClass} /> {/if}
或者先定义一个类型明确的变量再传递:
{#if !dummy} {#const typedItem = item as BookClass} <BookRowEntry item={typedItem} /> {/if}
方法3:确保数据源books的类型正确
先给books数组明确标注BookClass[]类型,让TS通过items的类型反向推断item的类型:
// 在脚本部分定义books时指定类型 const books: BookClass[] = [/* 你的书籍数据 */];
方法4:补全组件的类型定义
如果better-svelte-virtual-list没有提供完善的TS类型,可以自己创建类型声明文件(比如better-svelte-virtual-list.d.ts):
declare module 'better-svelte-virtual-list' { import type { Component } from 'svelte'; export interface VirtualListProps<T> { items: T[]; itemHeight: number; containerHeight: number; scrollTop: number; } export const VirtualList: Component<VirtualListProps<any>>; }
添加后就能像方法1那样使用泛型指定类型了。
错误提示回顾:
Type '{}' is missing the following properties from type 'BookClass': pg, indexts(2739)
内容的提问来源于stack exchange,提问作者Markstar
相关产品推荐
相关产品推荐

