# 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>
);
};
```