Genel işlev türünü tanımlayın ve işlev atamasına uygulayın

0

Soru

Bunun gibi genel bir işlevi tanımlayabilir ve kullanabilirim:

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

const emptyStringArray = fetchData<string>();

Ancak, gerçek senaryomda çok fazla param var ve yazım ve işlev atamalarını ayırmak istiyorum.

Böyle yazmaya çalıştım.:

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

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

const emptyStringArray = fetchData2<string>();

Ancak, şimdi işlev tanımı tanımıyor T kullanılabilir bir tür olarak.

'T' ismi bulunamıyor.

Nereye koyacağıma dair birçok farklı yapılandırma denedim <T> ama hiçbir şey herhangi bir fikir çalışmak gibi görünüyor?

TS Oyun Alanında Demo


İlgili Sorular

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

En iyi cevabı

2

IFetchData dönüş yazmayı sizin için yapıyor, bu yüzden jeneriği atlatmak için çalışmalı fetchData2 işlev dönüşü. Aşağıdakiler işe yarıyor mu?

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

Yakın, ama ideal olarak jeneriği tanımda tutabilirim. Küçük bir örnek oluşturmaya çalışırken basitleştirildi, ancak aslında bir başlangıç dizisi oluşturuyorum ve buna itiyorum - Güncellenmiş Örnek
KyleMit

İçerideki jeneriğe erişmeniz gerekiyorsa fetchData2 yaklaşım, ilk yaklaşımınıza benzer gibi görünüyor (olmadan IFetchData: const fetchData2 = <T>() => { const arr: T[] = []; return arr;}
Nick
1

Her şeyden önce, bu işlev:

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

    return arr
}

kullanmak zor.

Argümanlarınızın hiçbiri aşağıdakilerle ilgili olmadığından T, TS size izin vermez push için herhangi bir değer arr. Tabii ki, tür onaylama işlemini kullanabilirsiniz as, ama çok güvensiz:

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

İlgili soru / cevap, makalem

Cevap kolay ve basittir: bu durumda ayırmak imkansızdır T geçici çözümler olmadan işlev tanımından.

Burada en basit yol var:

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

Ancak, dizinizi içinde mutasyona uğratmak istiyorsanız fetchData bu işlev imzası kullanışlı değildir. Bu işlev ile hiçbir şey yapmasına izin verilmez arr. Tek yapabileceğin geri dönmek. arr herhangi bir mutasyon olmadan.

Bu listeyi değiştirmek için, daha yüksek mertebeden bir işlev oluşturmanız ve arama sırasında fetchData açık genel argüman sağlayın:

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[]

Bahçe

2021-11-24 08:54:18
0

Bunu deneyebilir misin?

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

Diğer dillerde

Bu sayfa diğer dillerde

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