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的类型兼容性,你们能够看下面这些类型