ค้นหาเว็บไซต์

Typescript + Svelte - วิธีเพิ่มประเภทให้กับ props ของคอมโพเนนต์ที่กระจาย


เป็นไปได้ไหมที่จะรับประกันความปลอดภัยของชนิดข้อมูลกับคอมโพเนนต์ที่ประกอบขึ้นจากคอมโพเนนต์อื่น ๆ?

เช่น ถ้าฉันต้องการสร้างอินพุตชนิดพิเศษที่มีการตรวจสอบเฉพาะบางอย่าง ฯลฯ ซึ่งควร ขยาย อินพุตฐานของฉัน

BaseInput.svelte

<script lang="ts">
  export let value = '';
  // + a lot more props
</script>

<input bind:value ... />

AgeInput.svelte - นี่ขยาย BaseInput

<script lang="ts">
  import BaseInput from './BaseInput.svelte'

  export let {...inputProps}: /* Can we spread and infer BaseInput props? */;
</script>

<BaseInput {...inputProps} type="number" />

เราสามารถสรุปคุณสมบัติ BaseInput ได้ไหม?

คำตอบ #1

Svelte สร้าง input ประเภท number แตกต่างจากประเภท text.

สำหรับฝั่งของฉัน ฉันสร้างอินพุตสองประเภทเพื่อนำเข้า

สำหรับ inputText.svelte:

<script lang="ts">
  export enum TextType { text = "text", email = "email", password = "password" }

  export let id: string;
  export let type: TextType;
  export let label: string | null = null;
  export let placeholder: string | null = null;
  export let value: string | null = null;

  function typeAction(node: HTMLInputElement) {
    node.type = type
  }

</script>

<div class="textInput">
    <label class="textLabel" for={id}>{label}</label>
  <input on:input bind:value id={id} type="text" placeholder={ placeholder } use:typeAction />
</div>

ฟังก์ชันนี้:

 function typeAction(node: HTMLInputElement) {
    node.type = type

เป็นสิ่งสำคัญมากที่จะผ่านประเภทของข้อมูลนำเข้า:

  export enum TextType { text = "text", email = "email", password = "password" }

และนี่คือตัวอย่างของ inputNumber.svelte ของฉัน :

<script lang="ts">
    export let id: string;
    export let label: string | null = null;
    export let placeholder: string | null = null;
    export let value: number | null = null;
    export let min: number | null = null;
    export let max: number | null = null;
</script>
  
<div class="numberInput">
  <label class="numberLabel" for={id}>{label}</label>
  <input on:change bind:value id={id} type="number" placeholder={placeholder} min = {min} max = {max} {...$$restProps}/>
</div>

หลังจากที่ฉันนำเข้ามาตามปกติ

คำตอบ #2

คุณสามารถใช้ตัวแปร $$props ของ svelte ได้

แอพ.svelte

<script>
    import AgeInput from './AgeInput.svelte'
</script>

<AgeInput 
    bi_p1="base input prop 1" 
    bi_p2="base input prop 2" 
    ai_p1="age input prop 1" 
    ai_p2="age input prop 2" 
/>

baseinput.svelte

<script lang="ts">
    export let bi_p1;
    export let bi_p2;
  // + a lot more props
</script>

<input />
<pre>
    base input properties
    bi_p1: {bi_p1}
    bi_p2: {bi_p2}
</pre>

ageinput.svelte

<script lang="ts">
  import BaseInput from './BaseInput.svelte';
    
    const {bi_p1, bi_p2, ai_p1, ai_p2, ...restProps} = $$props
</script>

<BaseInput {bi_p1} {bi_p2} type="number" />
<pre>
    age input props
    ai_p1: {ai_p1}
    ai_p2: {ai_p2}
</pre>

นี่คือลิงก์ REPL https://svelte.dev/repl/a22f404887164fc4a5a6d54dfdff1380?version=3.17.2

บทความที่เกี่ยวข้อง