1、静态类型

  1. interface Point {
  2. x: number;
  3. y: number;
  4. }
  5. const point: Point = {
  6. x: 3,
  7. y: 4
  8. };
  9. // 基础类型, boolean, number, string, void, undfined, symbol, null
  10. const count1: number = 123;
  11. const teacherName: string = 'xiaohong';
  12. // 对象类型
  13. const teacher1: {
  14. name: string;
  15. age: number;
  16. } = {
  17. name: 'xiaohong',
  18. age: 18
  19. };
  20. // 数组
  21. const numbers: number[] = [1, 2, 3];

2、函数注解和类型推断

  • type annotation 类型注解, 我们来告诉 TS 变量是什么类型
  • type inference 类型推断, TS 会自动的去尝试分析变量的类型
  • 如果 TS 能够自动分析变量类型,我们就什么也不需要做了
  • 如果 TS 无法分析变量类型的话,我们就需要使用类型注解 ```javascript // 自动推断返回值类型 function getTotal1(firstNumber: number, secondNumber: number) { return firstNumber + secondNumber; }

const total = getTotal1(1,2);

// 需要加类型注解 let count: number; count = 123;

// 自动推断为number类型 let countInference = 123;

  1. <a name="vRTo5"></a>
  2. # 3、函数类型
  3. ```javascript
  4. // 有返回值
  5. function add(first: number, second: number): number {
  6. return first + second;
  7. }
  8. // 无返回值
  9. function sayHello(): void {
  10. console.log('hello');
  11. }
  12. // never
  13. function errorEmitter(): never {
  14. while(true) {}
  15. }
  16. // 参数是对象
  17. function add({ first, second }: { first: number; second: number }): number {
  18. return first + second;
  19. }
  20. // 箭头函数
  21. const getNumber: (param: number) => number = (param: number) => {
  22. return param;
  23. };
  24. // 箭头函数泛型
  25. const func1: <T>(str: T) => T = <T>(str: T) => {
  26. return str;
  27. };

4、数组元组

  1. // 数组
  2. const arr: (number | string)[] = [1, '2', 3];
  3. const stringArr: string[] = ['a', 'b', 'c'];
  4. const undefinedArr: undefined[] = [undefined];
  5. // type alias 类型别名
  6. type User = { name: string; age: number };
  7. // 元组 tuple
  8. const teacherInfo: [string, string, number] = ['xiaohong', 'male', 18];
  9. const teacherList: [string, string, number][] = [['xiaohong', 'male', 19], ['sun', 'female', 26], ['jeny', 'female', 38]];

5、interface

  1. interface Person {
  2. // readonly name: string; 只读
  3. name: string;
  4. age?: number;
  5. [propName: string]: any;
  6. say(): string;
  7. }
  8. const getPersonName = (person: Person): void => {
  9. console.log(person.name);
  10. };
  11. const person = {
  12. name: 'xiaohong',
  13. sex: 'male',
  14. say() {
  15. return 'say hello';
  16. },
  17. };
  18. getPersonName(person);

6、类

  1. // private, protected, public 访问类型
  2. // public 允许我在类的内外被调用
  3. // private 允许在类内被使用
  4. // protected 允许在类内及继承的子类中使用
  5. // 构造函数
  6. class Person {
  7. // 传统写法
  8. // public name: string;
  9. // constructor(name: string) {
  10. // this.name = name;
  11. // }
  12. // 简化写法
  13. constructor(public name: string) {}
  14. }
  15. // 继承
  16. class Person {
  17. constructor(public name: string) {}
  18. }
  19. class Teacher extends Person {
  20. constructor(public age: number) {
  21. super('xiaoming');
  22. }
  23. }
  24. const teacher = new Teacher(28);
  25. console.log(teacher.age);
  26. console.log(teacher.name);

7、抽象类

  1. abstract class Geom {
  2. width: number;
  3. getType() {
  4. return 'Gemo';
  5. }
  6. abstract getArea(): number;
  7. }
  8. class Circle extends Geom {
  9. getArea() {
  10. return 123;
  11. }
  12. }
  13. new Circle()

8、枚举

  1. // 默认从0开始
  2. enum Status {
  3. OFFLINE = 1,
  4. ONLINE,
  5. DELETED
  6. }

9、泛型

  1. function join<T, P>(first: T, second: P) {
  2. return `${first}${second}`;
  3. }
  4. join<number, string>(1, "1");
  5. join(1, "1"); // 可省略
  6. // 箭头函数泛型
  7. const func1: <T>(str: T) => T = <T>(str: T) => {
  8. return str;
  9. };
  10. // 类泛型
  11. class DataManager<T extends Item> {
  12. constructor(private data: T[]) {}
  13. getItem(index: string): T {
  14. return this.data[index];
  15. }
  16. }
  17. const data = new DataManager([
  18. {
  19. name: "xiaoming",
  20. },
  21. ]);
  22. data.getItem('name');

10、联合类型

  1. function formatPX(size: number | string) {
  2. // ...
  3. }
  4. formatPX(13); // ok
  5. formatPX('13'); // ok

11、类型保护

类型保护允许你使用更小范围下的对象类型。

  1. // typeof
  2. function doSome(x: number | string) {
  3. if (typeof x === 'string') {
  4. // 在这个块中,TypeScript 知道 `x` 的类型必须是 `string`
  5. console.log(x.substr(1)); // ok
  6. }
  7. x.substr(1); // Error: 无法保证 `x` 是 `string` 类型
  8. }
  9. // instanceof
  10. class Foo {
  11. foo = 123;
  12. common = '123';
  13. }
  14. class Bar {
  15. bar = 123;
  16. common = '123';
  17. }
  18. function doStuff(arg: Foo | Bar) {
  19. if (arg instanceof Foo) {
  20. console.log(arg.foo); // ok
  21. console.log(arg.bar); // Error
  22. }
  23. if (arg instanceof Bar) {
  24. console.log(arg.foo); // Error
  25. console.log(arg.bar); // ok
  26. }
  27. }
  28. doStuff(new Foo());
  29. doStuff(new Bar());
  30. // in
  31. interface A {
  32. x: number;
  33. }
  34. interface B {
  35. y: string;
  36. }
  37. function doStuff(q: A | B) {
  38. if ('x' in q) {
  39. // q: A
  40. } else {
  41. // q: B
  42. }
  43. }
  44. // 字面量类型保护
  45. type Foo = {
  46. kind: 'foo'; // 字面量类型
  47. foo: number;
  48. };
  49. type Bar = {
  50. kind: 'bar'; // 字面量类型
  51. bar: number;
  52. };
  53. function doStuff(arg: Foo | Bar) {
  54. if (arg.kind === 'foo') {
  55. console.log(arg.foo); // ok
  56. console.log(arg.bar); // Error
  57. } else {
  58. // 一定是 Bar
  59. console.log(arg.foo); // Error
  60. console.log(arg.bar); // ok
  61. }
  62. }