جاوااسکریپت - تایپاسکریپت - هیچ امضای اندیسی با پارامتری از نوع 'string' وجود ندارد
چیزها در جاوااسکریپت ساده هستند:
interface Person {
id: number
red: number
green: number
blue: number
buckets: Array<BucketType>
// Does the index signature go here? What does it look like?
// I haven't seen any "standard" way of doing this
}
interface BucketType {
color: string,
weight: number
}
const personA = {
id: 123,
red: 4,
green: 5,
blue: 6,
buckets: [
{
color: 'Blue',
weight: 4
}
]
}
const personB = {
id: 456,
red: 7,
green: 8,
blue: 9,
buckets: [
{
color: 'Red',
weight: 10
}
]
}
const people = [ personA, personB ]
for (let person of people) {
for (let bucket of person.buckets) {
console.log(bucket.weight) // 4, then 10
console.log(bucket.color) // 'Blue', then 'Red'
bucket.weight += person[bucket.color.toLowerCase()] // ERROR: NO INDEX SIGNATURE!!!! (Typescript)
console.log(bucket.weight) // In pure Javascript, this logs '10', then '17'
}
}
واقعاً چه خبره. چطور میتوانم یک «امضای اندیس» به نوعهای شخصیام اضافه کنم تا بتوانم زندگیام را ادامه دهم؟
ببخشید که به صورت متنی غر میزنم، فقط از پیشرفت کردن خسته شدم و بعد TYPESCRIPT!!!
پاسخ شماره ۱
بررسیکننده نوع تایپاسکریپت شکایت میکند زیرا نمیتواند بررسی کند که کد شما منجر به خطا نخواهد شد. بررسیکننده نوع تایپاسکریپت نمیتواند مقادیر رشتههای 'Red' و 'Blue' را بخواند و بداند که اگر به حروف کوچک تبدیل شوند، با یکی از ویژگیهای شیء شما مطابقت دارند. این فقط در زمان اجرا قابل انجام است، نه در زمان بررسی نوع.
بنابراین شما باید به این ترتیب به کامپایلر اشاره کنید که نتایج ممکن bucket.color.toLowerCase() چه میتواند باشد:
bucket.weight += person[bucket.color.toLowerCase() as 'red'|'blue'|'green'];
