Vyhledávání na webu

typescript - Svelte (Vite) + Bootstrap 5 + SvelteStrap chyba: Typ 'string' nelze přiřadit k typu 'ButtonColor'


Používám Svelte (Vite) + Bootstrap 5 + SvelteStrap. Můj kód je následující:

<head>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email /dist/css/bootstrap.min.css">
</head>
<script>
    import { Button } from 'sveltestrap';
    let color = "danger";
</script>

<div>
    <Button color="{color}">{color}</Button>
</div>

To funguje normálně v prohlížeči, ale VSCode hlásí:

Typ 'string' nelze přiřadit k typu 'ButtonColor'.

Právě začínám se Svelte a snažím se upravit standardní příklad na webu SvelteStrap:

<head>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email /dist/css/bootstrap.min.css">
</head>
<script lang="ts">
  import { Button } from 'sveltestrap';
  const colors: any = [
    'primary',
    'secondary',
    'success',
    'danger',
    'warning',
    'info',
    'light',
    'dark'
  ];
</script>

{#each colors as color}
  <div>
    <Button {color}>{color}</Button>
  </div>
{/each}

Při použití standardního příkladu nejsou vyvolány žádné chyby. Co dělám špatně? Proč se to děje?

Odpověď č. 1

Jedná se o problém s typováním, chyba je generována TypeScriptem.

Očekávaný typ vlastnosti color je unijní typ různých řetězcových hodnot, ale výchozí pole řetězcových literálů bude typově určeno pouze jako string[], takže jeho položky již nebudou přiřaditelné k konkrétnějšímu typu založenému na řetězcových literálech.

Měli byste zde být schopni použít as const, abyste omezili typ pole na založený na literálech:

const colors = [
    'primary',
    'secondary',
    'success',
    'danger',
    'warning',
    'info',
    'light',
    'dark'
] as const; // <--

Toto je úplná definice typu ButtonColor:

declare type ButtonColor =
  | 'primary'
  | 'secondary'
  | 'success'
  | 'danger'
  | 'warning'
  | 'info'
  | 'light'
  | 'dark'
  | 'link';

Typ není exportován (i když by měl být), takže ho nelze použít přímo, ale můžete ho získat z třídy Button:

import type { SvelteComponentTyped } from 'svelte';
import type { Button } from 'sveltestrap';

type PropsOf<C> = C extends SvelteComponentTyped<infer Props> ? Props : never;
type ButtonProps = PropsOf<Button>;
type ButtonColor = Exclude<ButtonProps['color'], undefined>;

Demo TS hřiště

Také můžete zadat své pole pomocí tohoto:

const colors: ButtonColor[] = [
    'primary',
    'secondary',
    'success',
    'danger',
    'warning',
    'info',
    'light',
    'dark'
];

Související články