# 【Typescript】型別斷言
型別斷言(Type Assertion)可以用來手動指定一個值的型別。
語法:
```ts=
<型別>值
```
或
```ts=
值 as 型別
```
:::info
tsx中只能使用後者
:::
還記得[聯合型別](https://hackmd.io/@int/TSUnionType)嗎?有時候我們在確定型別之前可能就需要使用某個特定型別的屬性,此時就可以用型別斷言來指定目標變數的型別。
```ts=
function getLength(something: string | number): number {
if (something.length) {
return something.length;
} else {
return something.toString().length;
}
}
// index.ts(2,19): error TS2339: Property 'length' does not exist on type 'string | number'.
// Property 'length' does not exist on type 'number'.
// index.ts(3,26): error TS2339: Property 'length' does not exist on type 'string | number'.
// Property 'length' does not exist on type 'number'.
```
```ts=
function getLength(something: string | number): number {
if ((<string>something).length) {
return (<string>something).length;
} else {
return something.toString().length;
}
}
```
不可以斷言不存在的型別
```ts=
function toBoolean(something: string | number): boolean {
return <boolean>something;
}
// index.ts(2,10): error TS2352: Type 'string | number' cannot be converted to type 'boolean'.
// Type 'number' is not comparable to type 'boolean'.
```
as 的用法:
```jsx=
function toBoolean(something: any): boolean {
return something as boolean;
}
```
父子型別:
```ts=
class ApiError extends Error {
code: number = 0;
}
class HttpError extends Error {
statusCode: number = 200;
}
function isApiError(error: Error) {
if (typeof (error as ApiError).code === 'number') {
return true;
}
return false;
}
```
* 任何型別都能被斷言成 Any
* Any 可以被斷言成任何型別
:::warning
盡量不要使用 as any,但也不是說完全不能使用,要視情況決定
:::
雙重斷言
```ts=
interface Cat {
run(): void;
}
interface Fish {
swim(): void;
}
function testCat(cat: Cat) {
return (cat as any as Fish);
}
```
:::danger
沒事不要使用雙重斷言
:::
參考: https://ts.xcatliu.com/basics/type-assertion.html#%E7%B1%BB%E5%9E%8B%E6%96%AD%E8%A8%80-vs-%E7%B1%BB%E5%9E%8B%E8%BD%AC%E6%8D%A2
{"title":"【Typescript】型別斷言","description":"型別斷言(Type Assertion)可以用來手動指定一個值的型別。","contributors":"[{\"id\":\"5e26c66d-5ac6-4b0e-accd-3b5bb90a4d07\",\"add\":2973,\"del\":1008}]"}