美文网首页
TypeScript-2

TypeScript-2

作者: zzyo96 | 来源:发表于2018-11-27 14:41 被阅读0次

1.TypeScript 只会进行静态检查,如果发现有错误,编译的时候就会报错。
2.null和Undefined与 void 的区别是,undefined 和 null 是所有类型的子类型。也就是说 undefined 类型的变量,可以赋值给任意类型的变量:


image.png

3.声明一个变量为任意值之后,对它的任何操作,返回的内容的类型都是任意值。
4.变量如果在声明的时候,未指定其类型,那么它会被识别为任意值类型
5.类型推论:TypeScript 会在没有明确的指定类型的时候推测出一个类型,这就是类型推论。


image.png
6.如果定义的时候没有赋值,不管之后有没有赋值,都会被推断成 any 类型而完全不被类型检查
7.联合类型:
用 | 分开
8.当 TypeScript 不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型里共有的属性或方法。比如一个number和string 调用他们非公有的属性,看是否报错然后判断其的类型。 image.png
9.在 TypeScript 中,我们使用接口(Interfaces)来定义对象的类型。
interface Person {
  name: string;
  age: number
}

let jack: Person = {
  name: 'jack',
  age: 25
}
console.log(jack.name)

这个例子中,定义了一个接口 Person,定义了一个变量 jack,它的类型是 Person。这样,我们就约束了 jack 的形状必须和接口 Person 一致。接口一般首字母大写。注意:定义的变量中比接口少或者多一个属性都是不允许的。可见,赋值的时候,变量的形状必须和接口的形状保持一致。
10.如果不要完全匹配一个形状,那么可以用可选属性.(加个问号)

interface Man {
  name: string;
  age?: number;
}

let tom: Man = {
  name: 'tom'
}

11.如果要求接口允许有任意的属性,要这样做

interface Woman {
  name: string;
  age?: number;
  [propName: string]: any;
}
let amy: Woman = {
  name: 'amy',
  gender: 'female'
}
注意:一旦定义了任意属性,那么确定属性和可选属性都必须是它的子属性。 如果在加了age属性会报错,因为可选属性age为number类型,而任意属性的类型是string

12.只读属性。注意,只读的约束存在于第一次给对象赋值的时候,而不是第一次给只读属性赋值的时候。

interface Person {
  readonly id: number;
  name: string;
  age?: number;
  [propName: string]: any;
}

let tom1: Person = {
  name: 'Tom',
  gender: 'male',
  id:123
};

13.数组

1.类型+方括号表示法
2.数组泛型
3.接口表示数组
4.any在数组中的应用
一.「类型 + 方括号」表示法

let aaa: number[] = [1, 1, 2, 3, 4]

既然已经说了是number类型,在这个数组里就不能出现其他类型

let aaa: number[] = [1, '1', 2, 3, 5]  //报错

数组的一些方法的参数也会根据数组在定义时约定的类型进行限制

let fibonacci: number[] = [1, 1, 2, 3, 5];
fibonacci.push('8'); //报错

二.数组泛型。可以用数组泛型来表示数组。

let fan: Array<number> = [1, 2, 3, 5, 6, 4]

这个表示fan的类型是数组,数组里的元素是number类型
三.用接口表示数组

interface aaa {
  [index: number]:string
}

let kou:aaa=['好','好']
console.log(kou)

aaa 表示:只要 index 的类型是 number,那么值的类型必须是string。

interface NumberArray {
    [index: number]: number;
}
let fibonacci: NumberArray = [1, 1, 2, 3, 5];

NumberArray 表示:只要 index 的类型是 number,那么值的类型必须是 number。
四:any 在数组中的应用

let list: any[] = ['Xcat Liu', 25, { website: 'http://xcatliu.com' }];

一个比较常见的做法是,用 any 表示数组中允许出现任意类型

14.函数

14.1一个函数有输入和输出,要在 TypeScript 中对其进行约束,输入多余的(或者少于要求的)参数,是不被允许的

function sum(x: number, y: number): number {
    return x + y;
}

14.2 如果需要我们手动给 mySum 添加类型,则应该是这样:

let mySum: (x: number, y: number) => number = function (x: number, y: number): number {
    return x + y;
};

在 TypeScript 的类型定义中,=> 用来表示函数的定义,左边是输入类型,需要用括号括起来,右边是输出类型。
14.3 用接口定义函数的形状

interface SearchFunc {
    (source: string, subString: string): boolean;
}

let mySearch: SearchFunc;
mySearch = function(source: string, subString: string) {
    return source.search(subString) !== -1;
}

14.4 输入多余的(或者少于要求的)参数,是不允许的。用 ? 表示可选的参数

function buildName(firstName: string, lastName?: string) {
    if (lastName) {
        return firstName + ' ' + lastName;
    } else {
        return firstName;
    }
}
let tomcat = buildName('Tom', 'Cat');
let tom = buildName('Tom');

14.5 需要注意的是,可选参数必须接在必需参数后面。换句话说,可选参数后面不允许再出现必须参数了
14.6 TypeScript 会将添加了默认值的参数识别为可选参数

function buildName(firstName: string, lastName: string = 'Cat') {
    return firstName + ' ' + lastName;
}
let tomcat = buildName('Tom', 'Cat');
let tom = buildName('Tom');

此时就不受「可选参数必须接在必需参数后面」的限制了

function buildName(firstName: string = 'Tom', lastName: string) {
    return firstName + ' ' + lastName;
}
let tomcat = buildName('Tom', 'Cat');
let cat = buildName(undefined, 'Cat');

14.7 重载
重载允许一个函数接受不同数量或类型的参数时,作出不同的处理。

重复定义了多次函数 reverse,前几次都是函数定义,最后一次是函数实现。在编辑器的代码提示中,可以正确的看到前两个提示。

注意,TypeScript 会优先从最前面的函数定义开始匹配,所以多个函数定义如果有包含关系,需要优先把精确的定义写在前面。

function reverse(x: number): number;
function reverse(x: string): string;
function reverse(x: number | string): number | string {
    if (typeof x === 'number') {
        return Number(x.toString().split('').reverse().join(''));
    } else if (typeof x === 'string') {
        return x.split('').reverse().join('');
    }
}

14.8 类型断言
有时候,我们需要在还不确定类型的时候就访问其中一个类型的属性或方法

此时可以使用类型断言,将 something 断言成 string:

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

类型断言不是类型转换,断言成一个联合类型中不存在的类型是不允许的

15.声明文件
假如我们想使用第三方库,比如 jQuery,我们通常这样获取一个 id 是 foo 的元素:

$('#foo');
// or
jQuery('#foo');

但是在 TypeScript 中,我们并不知道 $ 或 jQuery 是什么东西,这时,我们需要使用 declare 关键字来定义它的类型,帮助 TypeScript 判断我们传入的参数类型对不对

declare var jQuery: (selector: string) => any;

jQuery('#foo');

编译结果是:

jQuery('#foo');
image.png

相关文章

  • TypeScript-2

    1.TypeScript 只会进行静态检查,如果发现有错误,编译的时候就会报错。2.null和Undefined与...

网友评论

      本文标题:TypeScript-2

      本文链接:https://www.haomeiwen.com/subject/tsrlqqtx.html