آرایه چندبعدی - تایپاسکریپت نمیتواند نوع داخلی Iterable از Iterable را استنتاج کند
در اینجا یک تابع ساده وجود دارد که یک Iterable از Iterable ها را میگیرد.
function unwrapFirst<T extends Iterable<U>, U>(iter: Iterable<T>): U {
return [...[...iter][0]][0];
}
unwrapFirst([[1,2,3],[4,5,6]]);
من انتظار داشتم که TypeScript نوع U را به درستی به عنوان number استنتاج کند، اما آن را به عنوان unknown استنتاج میکند. آیا کسی میتواند توضیح دهد چرا؟ و چگونه میتوان TypeScript را وادار کرد که U را به درستی استنتاج کند؟
پاسخ شماره ۱
محدودیتهای عمومی به عنوان مکانهای استنباط استفاده نمیشوند. برای یک مسئله مشابه به microsoft/TypeScript#44711 مراجعه کنید.
به احتمال زیاد شما انتظار داشتید که کامپایلر U را از T استنتاج کند با توجه به اینکه T محدود به Iterable<U> است. اما این اتفاق نمیافتد زیرا محدودیتها به عنوان مکانهای استنتاج استفاده نمیشوند. بنابراین نوع استنتاج شده برای T هیچ تأثیری بر U ندارد، و بنابراین U استنتاج نمیشود و کامپایلر به unknown بازمیگردد.
اگر میخواهید از استنباط برای به دست آوردن U از T استفاده کنید، تابع را فقط در T عمومی خواهید کرد و سپس U را از طریق استنباط نوع شرطی محاسبه میکنید. برای مثال:
function unwrapFirst<T extends Iterable<any>>(
iter: Iterable<T>
): T extends Iterable<infer U> ? U : never {
return [...[...iter][0]][0];
}
const res = unwrapFirst([[1, 2, 3], [4, 5, 6]]);
// const res: number
خوب به نظر میرسد!
لینک زمین بازی به کد
