TypeScript
,總結了如下幾個點,但願能夠幫到你們關注/在看
interface Obj { a: string; } const obj: Obj = { a: "1", }; obj.b = 2;
類型「Obj」上不存在屬性「b」。
interface Obj { a: string; [index: string]: string | number; } const obj: Obj = { a: "1", }; obj.b = 2;
[index: string]: string | number;
,類型是字符串或者數字。由於:當你聲明一個索引簽名時,全部明確的成員都必須符合索引簽名
// 重載 function padding(all: number); function padding(topAndBottom: number, leftAndRight: number); function padding(top: number, right: number, bottom: number, left: number); // Actual implementation that is a true representation of all the cases the function body needs to handle function padding(a: number, b?: number, c?: number, d?: number) { if (b === undefined && c === undefined && d === undefined) { b = c = d = a; } else if (c === undefined && d === undefined) { c = a; d = b; } return { top: a, right: b, bottom: c, left: d }; }
這樣函數兼容 傳 一、二、4個參數。 可是隻要傳三個,就會報錯。
npm i somePackage --save import somePackage from 'somePackage';
找不到模塊「somePackage」或其相應的類型聲明。
declare module 'somePackage'; ...
這個問題迎刃而解
類型變量
,以下所示:class Peter { niubi<T>(a: T): T[] { return [a]; } }
此時的T就是一個泛型,它是一個可變的類型。根據你傳入niubi
這個方法的參數對象來肯定的,當咱們傳入的a
是字符串,那麼T就爲string
.返回的就是一個item
爲字符串的數組
class Peter { niubi<T>(a: T): T[] { return [a]; } } const obj = new Peter(); let res = obj.niubi("hehe"); res = 1; res = ["2"];
此時res = 1會報錯不能將類型「number」分配給類型「string[]」
, 由於此時TS推斷出來,res一定爲一個數組,且裏面的item是一個字符串.ios
res = ["2"]
則不會報錯
let res2 = obj.niubi(2); res2 = 2;
不能將類型「number」分配給類型「number[]」。
最後要記住的是,既然是類型變量。那麼這個變量也能夠是一個泛型。
class Peter { niubi<T>(a: T): T[] { return [a]; } } const obj = new Peter(); function test<T>(b: T): T { return b; } let res = obj.niubi(test(1));
// 請求接口數據 export interface ResponseData<T = any> { /** * 狀態碼 * @type { number } */ code: number; /** * 數據 * @type { T } */ result: T; /** * 消息 * @type { string } */ message: string; }
data
數據是動態的格式,咱們能夠用泛型來定義。data
數據,再用泛型方式傳入,組裝好返回的整個返回數據接口(包含code,result,data
)。再接着傳入到真正的請求函數中// 在 axios.ts 文件中對 axios 進行了處理,例如添加通用配置、攔截器等 import Ax from './axios'; import { ResponseData } from './interface.ts'; export function getUser<T>() { return Ax.get<ResponseData<T>>('/somepath') .then(res => res.data) .catch(err => console.error(err)); }
<T>
,那麼便返回一個Promise
風格的Promise<T>
數據 :const get = <T>(config: { url: string; headers?: { [key: string]: string } }): Promise<T> => { const fetchConfig = { method: 'GET', Accept: 'application/json', 'Content-Type': 'application/json', ...(config.headers || {}) }; return fetch(config.url, fetchConfig).then<T>(response => response.json()); };
總結兩次泛型的連續使用:
1.使用data
做爲泛型,傳入npm
2.組裝成{code,result,data}
這種類型接口json
3.將第二步的組裝後類型做爲泛型<T>
傳入get
方法中axios
4.返回一個Promise
風格的Promise<T>
數據api
這樣作的意義,提取可變的數據類型data
,讓TS推斷出這個接口返回的數據是怎麼樣的。減小沒必要要的重複代碼,即每次接口調取都會返回的數據格式類型:code
和result
TS
的泛型如何用,什麼地方使用,以及使用的意義了。interface test1 { a: string; } interface test2 { b: string; }
const obj: test1 & test2 = { a: "1", b: "2", };
a/b
的對象,能夠使用const obj: test1 | test2 = { a: "1", };
可能有人會說,怎麼會寫這麼簡單的東西。
type類型
,類型系統就是它的核心。interface Test1 { a: number; b: number; c: string; } interface Test2 { a: number; b: number; } let test1: Test1 = { a: 1, b: 2, c: "3", }; let test2: Test2 = { a: 1, b: 2, }; test1 = test2;
此時提示
類型 "Test2" 中缺乏屬性 "c",但類型 "Test1" 中須要該屬性。
test2 = test1;
這個時候是能夠的
Test1
接口比Test2
接口多一個c
屬性,Test2
接口能夠說是Test1
接口的子類。這是多態性
關於如何處理、判斷TS的類型兼容性,你們能夠看下面這些類型