Biến 'test' được sử dụng trước khi được gán giá trị - Typescript
Tôi đang gặp lỗi trong việc triển khai mã TypeScript này. Tôi đang ánh xạ một kiểu này sang kiểu khác. Nhưng VSCode hiển thị lỗi rằng biến 'test' được sử dụng trước khi được gán giá trị. Có ai có thể giúp tôi không?
interface A {
name: string;
age: string;
sex: string;
}
interface B {
name: any;
age: string;
sex: string;
}
const modifyData = (g : B) :A => {
let test: A;
test.name = g.name['ru'];
test.age = g.age;
test.sex = g.sex;
return test as A;
};
const g = [{
"name": {
"en": "George",
"ru": "Gregor"
},
"age": "21",
"sex": "Male"
},
{
"name": {
"en": "David",
"ru": "Diva"
},,
"age": "31",
"sex": "Male"
}];
const data = g.map(modifyData);
console.log(data);
Câu trả lời #1
Để làm rõ một chút, điều này phụ thuộc vào sự khác biệt giữa "được gán" và "được định nghĩa." Ví dụ:
let myDate: Date; // I've defined my variable as of `Date` type, but it still has no value.
if (!someVariable) {
myDate = new Date();
}
console.log(`My date is ${myDate}`) // TS will throw an error, because, if the `if` statement doesn't run, `myDate` is defined, but not assigned (i.e., still has no actual value).
Định nghĩa đơn giản có nghĩa là gán cho nó một giá trị ban đầu:
let myDate: Date | undefined = undefined; // myDate is now equal to `undefined`, so whatever happens later, TS won't worry that it won't exist.
Câu trả lời #2
Lỗi này được kích hoạt vì TypeScript vẫn coi biến là chưa xác định trong một số trường hợp. Thêm ! trước biến sẽ cho TypeScript biết loại bỏ undefined hoặc null như các loại có thể có của biến:
let test!: A;
Tài liệu về khai báo gán xác định
Sân chơi: typescript/sân chơi
Câu trả lời #3
Nó thực sự chưa được gán. Nó được định nghĩa, nhưng không có giá trị.
Để đưa ra một ví dụ
let text: string; // variable `text` gets defined, but it has no assigned value - it is defined but unassigned
if (Math.random() > 0.5) {
text = "heads";
}
// console.log(`We flipped ${text}`) // this would be an error for the compiler as the variable text might still not have a value assigned to it
text = "tomato"; // here we finally guarantee that text will have a value assigned to it and we can safely use it as string
console.log(`We found ${text}`)
Theo ý kiến khiêm tốn của tôi, cách sạch sẽ nhất sẽ là trả về một giá trị literal:
const modifyData = (g: B):A => {
return {
name: g.name['ru'],
age: g.age,
sex: g.sex
} as A;
};
