SQL სერვერი - ელემენტს აშკარად აქვს 'any' ტიპი იმიტომ, რომ 'string' ტიპის გამოხატვა ვერ გამოიყენება 'Type' ტიპის ინდექსირებისთვის
მე ვცდილობ შევამცირო მნიშვნელობები ობიექტების მასივში, რომელიც დაბრუნებულია REST API-დან.
ეს არის ობიექტისთვის, რომლის მოლოდინიც მაქვს, ინტერფეისი.
interface IProduct {
productId: number;
qty: number;
code: string;
customer: string;
description: string;
}
მე ვცდილობ ობიექტების მასივზე მიმივლებოდი და ყველა ობიექტის მნიშვნელობა მოვჭრა.
products.forEach(record => {
if (record) {
Object.keys(record).map(key => {
record[key] = record[key].trim();
});
}
});
მე ვიღებ შემდეგ სხრონს.
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'IProduct'.
No index signature with a parameter of type 'string' was found on type 'IProduct'.
ვცადე ობიექტისთვის ინდექსის სიგნატურის დამატება, მაგრამ ვერაფერი გამოვიდა. [key: string]: string და ასევე key: {[index: string]: string}.
არის რამე რაც მაკლია, მეგონა ეს საკმარისი იქნებოდა იმისთვის, რომ TS კომპილატორმა ჩივილი შეწყვიტოს.
აქაა ობიექტის რეფერენცია.
const products: Product[] = [
{
productId: 1,
qty: 100,
code: 'code',
customer: 'customer',
description: 'the description',
},
{
productId: 2,
qty: 102,
code: 'code',
customer: 'customer',
description: 'the description',
},
];
დიდი მადლობა
პასუხი #1
Object.keys-ის განსაზღვრა არის:
interface ObjectConstructor {
keys(o: object): string[];
keys(o: {}): string[];
}
ეს იმიტომ არის, რომ შეგიძლია ასე გამოიტანო კოდი:
const object = {
productId: 1,
qty: 100,
code: 'code',
customer: 'customer',
description: 'the description',
someOtherKey: 'foo', // extra key here
};
const product: IProduct = object;
const keys = Object.keys(product); // keys contains someOtherKey
შეცდომის გამოსასწორებლად, შეგიძლიათ გამოიყენოთ ტიპის დადასტურება:
products.forEach(record => {
if (record) {
(Object.keys(record) as (keyof IProduct)[]).map(/* ... */);
}
});
თუმცა, თუ იცით, რომ დამატებითი გასაღებები არ იქნება, შეგიძლიათ დაუმატოთ ეს გადატვირთვა:
declare global {
interface ObjectConstructor {
keys<K extends PropertyKey>(o: Record<K, unknown>): K[];
}
}
// declare global can only be in a module, so if the file isn't
// a module already you'll need to add this
export {};
ეს გზით, თქვენ არ დაგჭირდებათ ტიპის დადასტურება, მაგრამ ტექნიკურად ეს ტიპურად უსაფრთხო არ არის.
