我正在測驗一些利用 TypeScript 中的物件的代碼,并注意到我的 IDE 的 IntelliSense 為我試圖添加的新屬性引發了錯誤。它指出屬性“文本”不存在,這是我的代碼:
// create new object
var thing : Object = new Object();
// Do things
thing.text = "This is a test.";
console.log(thing.text);
// dereference the object
thing = null;
錯誤在以下行突出顯示:
thing.text = "This is a test.";
console.log(thing.text);
當這是 JavaScript 中完全可接受的代碼和行為時,為什么 VS 代碼會將其列為錯誤?這是我的編輯器的錯誤截圖: 錯誤
編輯:我應該注意到代碼確實使用 tsc 編譯成有效的 JS 并且運行得很好,只是好奇為什么會出現錯誤,因為它在撰寫代碼時讓我失望,讓我認為沒有問題時會出現問題。它還在 tsc 的輸出中指出了相同的錯誤,這種能夠向物件添加和洗掉屬性的語言行為是否從 JavaScript 更改為 TypeScript?
uj5u.com熱心網友回復:
Typescript 型別不是最終代碼的一部分。當您構建/運行代碼時,沒有型別。在編程時,它們只是為了您的利益。因此,您可以撰寫型別不正確的有效代碼。打字稿會抱怨,但你的代碼仍然會運行。
初始化變數時,您將其型別設定為Object. 這基本上是{}. 它沒有任何屬性。當您嘗試為其設定一個值時,thing.text它會給您一個錯誤,因為thing它沒有任何屬性。
你有幾個選擇:
- 初始化:
thing_text
const thing = { text: "This is a test." };
thing.text = "You can change the value if you want.";
console.log(thing.text);
請注意,您不需要定義thing. Typescript 通過它的值知道它的型別。
- 或者
thing,為where宣告一個型別text是可選的:
type ThingType = {
text?: string;
};
// or just: const thing: ThingType = {}
const thing: ThingType = new Object();
thing.text = "This is a test.";
console.log(thing.text);
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/442537.html
標籤:javascript 打字稿 哎呀 ecmascript-6 打字稿泛型
上一篇:如何輸入:const[{dataContents,isLoading,isError},doFetch]=useFetchData();
