Typescript değişkenli demet türünü ve Javascript Spread’i birlikte kullanmak
Aşağıdaki kod parçasının nasıl çalıştığını anlamakta yardıma ihtiyacım var.
function concatFun<T extends any[], U extends any[]>(
arg1: T[],
arg2: U[]
): [...T, ...U] {
const newArr = [...arg1, ...arg2]; // (T | U)[]
return newArr; // error Type '(T | U)[]' is not assignable to type '[...T, ...U]'.
// Target requires 2 element(s) but source may have fewer.
}
Dönüş türünün [...T, ...U] olmasını istiyordum, ancak dönüş türü (T | U)[].
Cevap #1
SABİT Sağlanan argümanların literal türünü çıkarmanız gerekiyor
type Json =
| null
| string
| number
| boolean
| Array<JSON>
| {
[prop: string]: Json
}
function concatFun<
Fst extends Json, T extends Fst[],
Scd extends Json, U extends Scd[]>(
arg1: [...T],
arg2: [...U]
): [...T, ...U] {
return [...arg1, ...arg2]
}
concatFun([1, 2, 3], [4, 5, 6]) // [1, 2, 3, 4, 5, 6]
Oyun alanı
Güncelleme
function concatFun<
Fst extends Json, T extends Fst[],
Scd extends Json, U extends Scd[]>(
arg1: [...T],
arg2: [...U]
) {
const foo: [...T, ...U] = [...arg1, ...arg2]
return foo
}
}
TS'nin birleştirilmiş diziyi çıkarmasına yardımcı olabilirsiniz. Açıkçası, TS'nin bunu arka planda nasıl çözdüğünden emin değilim. Ama hata mesajı oldukça sezgiseldir, eğer foo'dan açık tür [...T, ...U]'yi kaldırırsanız
Cevap #2
Muhtemelen demek istediğiniz bu:
function concat<T extends readonly any[], U extends readonly any[]>(
arg1: T,
arg2: U,
): [...T, ...U] {
return [...arg1, ...arg2]
}
T[] "T dizisi" anlamına gelir, ama "dizi olan T" anlamına gelmez.
Bu TypeScript oyun alanına bak.
