You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

适配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 17:02:10