กำหนดทั่วไปฟังก์ชันประเภทและปรับใช้กับฟังก์ชันงาน

0

คำถาม

ฉันสามารถกำหนดและใช้ทั่วไปฟังก์ชันแบบนี้:

const fetchData = <T>(): T[] => {
  const arr: T[] = []
  // if stuff push to arr
  return arr
}

const emptyStringArray = fetchData<string>();

อย่างไรก็ตามในสถานการณ์จริงผมมีเยอะ params และต้องแยกกันออกจาก typings และฟังก์ชันองานที่ได้รับมอบหมาย

ฉันพยายามเขียนเหมือนนี้:

type IFetchData = <T>() => T[]

const fetchData2: IFetchData = () => {
  const arr: T[] = []
  // if stuff push to arr
  return arr
}

const emptyStringArray = fetchData2<string>();

อย่างไรก็ตามตอนนี้ฟังก์ชันนิยามไม่ได้จำที่ T เป็นที่ที่มีอยู่คนเดียว

ไม่สามารถค้นหาชื่อ'T'.

ฉันพยายามองรอยที่แตกต่างกันมากมา configurations อยู่ที่ไหนจะวาง <T>แต่ดูเหมือนไม่มีอะไรต้องทำงาน-มีความคิดอะไรอีกไหม

สาธิตใน TS สนามเด็กเล่น


คำถามเกี่ยวข้องกัน

typescript typescript-generics
2021-11-24 02:12:27
3

คำตอบที่ดีที่สุด

2

IFetchData กำลังทำอะไรกลับคืนพิมพ์สำหรับคุณดังนั้นมันควรจะทำงานไม่ลงรายละเอียคนจากทั่วไป fetchData2 ฟังก์ชันกลับมา ทำต่อไปนี้ทำงาน?

type IFetchData = <T>() => T[]
const fetchData2: IFetchData = () => {
  return [];
}
2021-11-24 02:18:56

ใกล้เคียงแต่เข้าท่าดีนิเราจะทำทุกอย่างที่เราทำฉันสามารถที่จะให้คนทั่วไปอยู่ในนิยาม. มันมีประยุกต์@item text character set ออกไปพยายามที่จะสร้างเล็กน้อนตัวอย่างแต่จริงๆแล้วฉันกำลังสร้างการเริ่มต้นอาเรย์และผลักไส obects กับมัน-ปรับปรุงตัวอย่างเช่น
KyleMit

อืมถ้าคุณต้องการเข้าถึงคนทั่วไปข้างใน fetchData2 มันดูเหมือนคนเข้าใกล้จะคล้ายกับของคุณเริ่มเข้าใกล้(โดยไม่มี IFetchData: const fetchData2 = <T>() => { const arr: T[] = []; return arr;}
Nick
1

อย่างแรกทั้งหมดนี่ฟังก์ชัน:

const fetchData = <T,>(): T[] => {
    const arr: T[] = []
    arr.push(2) // error
    arr.push('str') // error

    return arr
}

มันยากที่จะใช้.

ตั้งแต่ไม่ใช่ของอาร์กิวเมนต์ไม่ได้เกี่ยวข้องกับ T,TS จะไม่ยอมให้คุณ push มีค่าไป arr. แน่นอนคุณสามารถใช้ประเภท assertion asแต่มันเป็นมากไม่ปลอดภัย:

const fetchData = <T,>(): T[] => {
    const arr: T[] = []
    arr.push('str' as any as T) // error

    return arr
}

const emptyStringArray = fetchData<number>(); // number[]
emptyStringArray[0].toExponential() // runtime error

เกี่ยวข้องกัน คำถาม/คำตอบ, ของฉันบทความ

คำตอบคือเรื่องง่ายและเรียบง่าย:มันเป็นไปไม่ได้ในกรณีนี้เพื่อแยกกัน T จากฟังก์ชันนิยามโดยไม่มีการวนรอบการทำงาน.

นี่คุณมีงานง่ายสุดทาง:

const fetchData = <T,>() => {
  const arr: T[] = []
  return arr
}

อย่างไรก็ตามถ้าคุณอยากจะ mutate ของคุณอาเรย์ข้างใน fetchDataนี่ฟังก์ชันลายเซ็นต์ไม่ได้เป็นประโยชน์หน่อย ฟังก์ชันนี้คือไม่ได้รับอนุญาตให้ทำอะไรกับ arr. ทั้งหมดที่คุณทำได้คือต้องกลับไป arr โดยที่ไม่มี mutations.

เพื่อที่จะ mutate องรายการนี้,คุณต้องการสร้างระดับสูงฟังก์ชั่นและตอเรีย fetchData ให้ explicit ทั่วไปอาร์กิวเมนต์:

type FetchData = <T>() => T[]
const fetchData: FetchData = () => []

const higherOrder = <T,>(elem: T) => {
  const arr = fetchData<T>();
  arr.push(elem)

  return arr
}



const test = higherOrder('str'); // ok, string[]
const test2 = higherOrder(42); // ok, number[]

สนามเด็กเล่น

2021-11-24 08:54:18
0

คุณน่าจะลองมัน?

type IFetchData = <T>() => T[]
const fetchData2: IFetchData = <T>() => {
  return [];
}
2021-11-24 08:13:59

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่