# 【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}]"}
    314 views