1.基本类型的用法
let isDone : boolean = true;
let num : number = 10000000;
let firstName : string = 'viking';
2.数组和元组
数组
let arr : number[] = [1,2,3,4]
arr.push(3)
元组(指定只能传入规定类型的值)
let arr : [number, string] = [1,'viking']
arr.push(3)
3.接口 (检查数据类型)
readonly 是指不能改变的
interface Iperson {
readonly id: number,
num: number,
name: string
}
let obj: Iperson = {
id: 1,
num: 10000000,
name: 'viking'
}
4.函数
函数使用 interface 传入指定类型, 返回值也需要返回指定类型
const add = (x: number, y: number, z?: number): number =>{
if(typeof z === 'number') {
return x + y + z;
} else {
return x + y;
}
}
interface ISum {
(x: number, y: number, z?: number): number
}
let add2: ISum = add;
5.联合类型
定义多种类型
const numberOrString: number | string
numberOrString.length
numberOrString.toString()
6.类型断言
用 as 关键字,定义确定类型进行使用属性和方法,也可以不使用关键字进行使用typeof进行判断
// 这里我们可以用 as 关键字,告诉typescript 编译器,你没法判断我的代码,但是我本人很清楚,这里我就把它看作是一个 string,你可以给他用 string 的方法。
function getLength(input: string | number): number {
const str = input as string
if (str.length) {
return str.length
} else {
const number = input as number
return number.toString().length
}
}
7.枚举
用enum关键字,定义枚举
const enum Direction {
Up = 'UP',
Down = 'DOWN',
Left = 'LEFT',
Right = 'RIGHT',
}
const value = 'UP';
if(value === Direction.Up) {
console.log('go up!')
}
8.泛型
泛型关键字 < T > 在函数形参括号前面使用, 作用是定义获取类型并可以用来指定类型
function echo <T> (any: T) : T {
return any;
}
const result = echo(123)
function swap<T, U> (tuple:[T, U]): [U, T] {
return [tuple[1], tuple[0]]
}
const result2 = swap('string', 123)
9.泛型约束
因为不知道会传入那种泛型类型所以不能随意操作属性和方法 可以使用接口的方式以extends的方式定义
function add<T>(ary: T): T {
// 直接使用方法是不正确的只能是传入当前类型的才可以
console.log(ary.length);
return ary;
}
// 上例中,泛型 T 不一定包含属性 length,我们可以给他传入任意类型,当然有些不包括 length 属性,那样就会报错
interface IWithLength {
length: number;
}
function echoWithLength<T extends IWithLength>(arg: T): T {
console.log(arg.length)
return arg
}
echoWithLength('str')
const result3 = echoWithLength({length: 10})
const result4 = echoWithLength([1, 2, 3])