TypeScript-2.斷言 Record

1.斷言

轉載連接:https://www.jianshu.com/p/4bd337c2115c

語法

<類型>值 或者 值 as 類型

在 tsx 語法(React 的 jsx 語法的 ts 版)中必須用後一種。
例子:將一個聯合類型的變量指定爲一個更加具體的類型
當 TypeScript 不確定一個聯合類型的變量到底是哪個類型的時候,我們只能訪問此聯合類型的所有類型裏共有的屬性或方法:

function getLength(something: string | number): number {
    return something.length;
}

// index.ts(2,22): error TS2339: Property 'length' does not exist on type 'string | number'.
//   Property 'length' does not exist on type 'number'.

而有時候,我們確實需要在還不確定類型的時候就訪問其中一個類型的屬性或方法,比如:

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'.

上例中,獲取 something.length 的時候會報錯。
此時可以使用類型斷言,將 something 斷言成 string:

function getLength(something: string | number): number {
    if ((<string>something).length) {
        return (<string>something).length;
    } else {
        return something.toString().length;
    }
}

function getLength(something: string | number): number {
    if ((something as string).length) {
        return (something as string).length;
    } else {
        return something.toString().length;
    }
}

類型斷言的用法如上,在需要斷言的變量前加上 即可。
類型斷言不是類型轉換,斷言成一個聯合類型中不存在的類型是不允許的:

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'.

作者:呼呼哥
鏈接:https://www.jianshu.com/p/4bd337c2115c
來源:簡書

2.Record

問題:常常在項目中會遇到 …xx沒有這個屬性
參考於網友:https://cloud.tencent.com/developer/ask/185239

該object類型旨在抽象出對象的任何鍵,而Record<K, T>存在以專門定義類型的鍵。這意味着嘗試訪問對象屬性時存在差異。
TypeScript將允許訪問類型對象的任何屬性,Record<any, any>即使特定鍵未知,因爲第一個通用參數是any。

let a: Record<any, any>;
a.foo; // works

object然而,在類型的對象上,不假設鍵any。與此一樣Record<any, …>,TypeScript不知道哪些鍵實際存在,但它不允許訪問任何鍵:

let b: object;
a.foo; // error: Property "foo" does not exist on type "object"

實例:

爲防止提示res 沒有這個屬性:

let res: Record<string, any>;
res.data && JSON.parse(res.data)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章