接口
定义了tom变量,类型为Person,那么tom的形状必须和接口Person一致(不能多也不能少)
interface Person {name: string;age: number;}let tom: Person = {name: 'Tom',age: 21}
可选属性(?:)
可选属性的含义是该属性可以不存在
interface Person {name: string;age?: number;}let tom: Person = {name: 'Tom'}; //合法
任意属性([propName: string])
一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它类型的子集
例如下面这种情况是不允许的
interface Person {name: string;age?: number;[propName: string]: string;}let tom: Person = {name: 'Tom',age: 25,gender: 'male'};
age是number类型,但任意类型只有字符串类型,任意类型应该要包括age的类型,正确写法如下
interface Person {name: string;age?: number;[propName: string]: string | number;}let tom: Person = {name: 'Tom',age: 25,gender: 'male'};
只读属性(readonly)
有时候我们希望对象中一些字段只能在创建时被赋值,那么可以用readonly定义只读属性。
interface Person {readonly id: number;name: string;age?: number;[propName: string]: any;}let tom: Person = {id: 89757,name: 'Tom',gender: 'male'};tom.id = 9527; //× id设置了只读,不允许被赋值
数组类型
声明数组的方式如下所示
let fibonacci: number[] = [1, 2, 3, 4, 5]let fib: Array<number> = [1, 2, 3]
函数的类型
函数声明
在JavaScript中声明函数的两种方式
function sum(x, y){return x+y}
typescript中函数的声明
function sum(x: number, y: number): number {return x + y;}
不难看出,在typescript中,不仅参数要声明类型,函数的返回值也要声明类型
**
函数表达式
js中
// 函数表达式(Function Expression)let mySum = function (x, y) {return x + y;};
typescript中**
let mySum: (x: number, y: number) => number = function (x: number, y: number): number {return x + y;};
这段代码是可以通过编译的,不过事实上,上面的代码只对等号右侧的匿名函数进行了类型定义,而等号左边的mySum,是通过赋值操作进行类型推论而判断出来的。如果需要我们手动给mySum添加类型,则应该是这样
let mySum: (x: number, y: number) => number = = function (x: number, y: number): number {return x + y;};
这里的箭头函数和ES6中的箭头函数不同。在ts的类型定义中, => 用来表示函数的定义,左边是输入类型,需要用括号括起来,右边是输出类型。
可选参数
ts中使用?表示可选参数,可选参数一般需要放在末尾
function buildName(firstName: string, lastName?: string) {if (lastName) {return firstName + ' ' + lastName;} else {return firstName;}}let tomcat = buildName('Tom', 'Cat');let tom = buildName('Tom');
参数默认值
ts中可以给函数的参数添加默认值,此时就不受「可选参数必须在必要参数后面」的限制了:
function buildName(firstName: string = 'Tom', lastName: string) {return firstName + ' ' + lastName;}let tomcat = buildName('Tom', 'Cat');let cat = buildName(undefined, 'Cat');
联合类型 和 类型断言
联合类型
当 TypeScript 不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型里共有的属性或方法:
// 我们只需要用中竖线来分割两个let numberOrString: number | string// 当 TypeScript 不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型里共有的属性或方法:numberOrString.lengthnumberOrString.toString()
断言
// 这里我们可以用 as 关键字,告诉typescript 编译器,你没法判断我的代码,但是我本人很清楚,这里我就把它看作是一个 string,你可以给他用 string 的方法。function getLength(input: string | number): number {const str = input as stringif (str.length) {return str.length} else {const number = input as numberreturn number.toString().length}}
