# TypeScript 學習筆記(未完) ### 原始資料型別 包括:boolean (布林值)、number (數值)、string (字串)、null、undefined 以及 ES6 中的新型別 Symbol。 let isDone: boolean = false; let decLiteral: number = 6; let hexLiteral: number = 0xf00d; let myName: string = 'Tom'; JavaScript 沒有空值(Void)的概念,在 TypeScript 中,可以用 void 表示沒有任何返回值的函式: function alertName(): void { alert('My name is Tom'); } undefined 和 null 是所有型別的子型別。也就是說 undefined 型別的變數,可以賦值給 number 型別的變數: let num: number = undefined;// 這樣不會報錯 ### 任意值(Any) 用來表示允許賦值為任意型別。 變數如果在宣告的時候,未指定其型別,那麼它會被識別為任意值型別 ### 型別推論 let myFavoriteNumber = 'seven'; myFavoriteNumber = 7; 雖然沒有定義他是string type但會自動推論是string所以如果在賦值過程中改變型別是不被允許的 ### 聯合型別(Union Types) 表示取值可以為多種型別中的一種。 let myFavoriteNumber: string | number; myFavoriteNumber = 'seven'; myFavoriteNumber = 7; ### 物件的型別——介面 在 TypeScript 中,我們使用介面(Interfaces)來定義物件的型別。 - 可選屬性(加上問號) - 任意屬性 interface Person { name: string; age?: number; [propName: string]: any; } let tom: Person = { name: 'Tom', gender: 'male' }; 使用 [propName: string] 定義了任意屬性取 string 型別的值。 需要注意的是,一旦定義了任意屬性,那麼確定屬性和可選屬性的型別都必須是它的型別的子集(就是age的型別只能是string了 - 唯讀屬性 有時候我們希望物件中的一些欄位只能在建立的時候被賦值,那麼可以用 readonly 定義唯讀屬性: interface Person { readonly id: number; name: string; } ### 陣列 - 「型別 + 方括號」表示法 最簡單的方法是使用「型別 + 方括號」來表示陣列: let fibonacci: number[] = [1, 1, 2, 3, 5]; - 陣列泛型 我們也可以使用陣列泛型(Array Generic) `Array<elemType>` 來表示陣列: `let fibonacci: Array<number> = [1, 1, 2, 3, 5];` ### 函式 一個函式有輸入和輸出,要在 TypeScript 中對其進行約束,需要把輸入和輸出都考慮到,其中函式宣告的型別定義較簡單 function sum(x: number, y: number): number { return x + y; } 介面: interface SearchFunc { (source: string, subString?:string): boolean; } 可選引數:加問號,可選引數後面不允許再出現必需引數了 如果有加預設值TypeScript 會將添加了預設值的引數識別為可選引數 let mySearch: SearchFunc; mySearch = function(source: string, subString: string) { return source.search(subString) !== -1; } [過載:](https://willh.gitbook.io/typescript-tutorial/basics/type-of-function#guo-zai) 過載允許一個函式接受不同數量或型別的引數時,作出不同的處理。 ### 型別斷言 型別斷言(Type Assertion)可以用來手動指定一個值的型別。 `<型別>值` 在 tsx 語法(React 的 jsx 語法的 ts 版)中必須用後一種。 `值 as 型別` ```javascript // 聲明一個字串類型變數 let message: string = "Hello, TypeScript!"; // 聲明一個函數,接受一個字串參數,返回字串 function sayHello(name: string): string { return `Hello, ${name}!`; } // 定義一個介面,表示一個人的基本信息 interface Person { name: string; age: number; address?: string; // address屬性是可選的 } // 定義一個類,表示一個人的詳細信息 class DetailedPerson implements Person { constructor(public name: string, public age: number, public address?: string) {} sayHello() { console.log(`Hello, my name is ${this.name}.`); } } //基本的函數聲明: interface Props { name: string; age: number; } const Person: React.FC<Props> = ({ name, age }) => { return <div>{name}, {age} years old</div>; }; //Hooks const Counter: React.FC = () => { const [count, setCount] = useState(0); const counterRef = useRef<HTMLDivElement>(null); const increment = () => { setCount(count + 1); counterRef.current?.classList.add("active"); }; return ( <div> <div ref={counterRef}>Count: {count}</div> <button onClick={increment}>Increment</button> </div> ); }; ```