小傻羊7.13~7.15学习笔记—— TypeScript笔记和React初步了解

7.13~7.15学习笔记

TypeScript笔记:

类名称、数组、元组、函数、数据类型any 类、继承和封装、public、protected、private

constructor构造函数、readonly、eumn枚举 接口的使用、可选/只读属性、继承类、可索引类型

抽象类、构造函数的缩写、get和set访问私有属性、定义函数的五种方法、类别名

函数的重载、类型判断typeof,instanceof、as断言、null和undefine

拓展运算符、泛型的一系列问题

  • 类名称

    var: var a:number;

    let : 限制变量的作用范围;

    const:常量

  • 数组:

    let myArr : number[]=	[1,2,3];
    
    let myArr : Array<string>=["yushayang","guojiguanxixuyuan"];
    
  • 元组:

    let yuanzu: [string,number]=["kalsjdh",2];
    
  • 函数:

    function add(a : int,b : int){
    
    	return a+b;
    
    }
    
    const add=(a : int,b :in (**: number**)** => {
    
    	return a+b;
    
    }
    

    !累加用number.reduce!!!

  • 数据类型any:

    let a:any;
    
    a=10;
    
    a="ajkhskdjah";
    
    a=[1,2,3];
    
    const log = (value :any)=>{
    
    	if(typeof value ===' number'){
    
    		return **`**your number is ${value}**`**;
    
    	}
    
    	if(typeof value ==="string"){
    
    		return **`**your name is ${value}**`**;
    
    	}
    
    	 throw new Error(**`**Excepted string or number,got ${value}.**`**);
    
    }		
    
  • class Person{
    
    	firstname : string;
    
    	lastname : string;
    
    }
    
    let aPerson=new Person();
    
    aPerson.firstname = "yu";
    
    aPerson.lastname="xiaoyang";
    

class Movie {
    name: string;
    play_count: number;
    created_at: string;
    time: string;

    
    constructor(name: string, play_count: number) {
        this.name = name;
        this.play_count = play_count;
    }

   
    display_play_count(padding: string = '*****') {
        return `${this.play_count} 次 数 ${padding}`
    }

 
    increase_play_count() {
        this.play_count += 1;
    }
}


let m = new Movie("美丽的羊", 18);
  • 继承和封装

    extends 继承;

    子类继承父类的属性,方法;

    子类方法和父类的重名优先调用子类的方法;

    子类方法调用父类方法时要用super.do()

  • **public>protected>private **

    public:任何属性和方法都可以在生成的对象中调用,继承的对象也可以调用,默认是public;

    private:私有的,只有在内部对象内调用,生成的调用不了。想调用私有属性和方法,要在类内生成公有方法;

    protect: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护形”。被其修饰的类、属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GVColi2b-1594813894096)(C:\Users\Administrator\Desktop\捕获.PNG)]

  • constructor构造函数

    如果申明为protected或者private,当前类不能new;

    当父类申明为protected,子类重写constructor方法后可以new;

    如果父类申明为private,子类不能new和extends;

    Super在constrcutor方法中是调用父类的构造方法,必要时传入参数

    作用:

    • 当不想被实例化,而只想让子类继承后实例化,可以申请为protector
    • 都不想让子类和父类实例化或继承,可以申请为private
    • 一般情况下,申请为public(或不写)
  • static

  • readonly只读属性

    readonly name :string = ‘xiaoyang’

  • enum枚举类型

    enum DaysOfTheWeek{
    	SVN=100,MON,TUE,WED,THU,FRI,SAT
    }
    
    let day: DaysOfTheWeek;
    day = DaysOfTheWeek.MON;
    
    if(day=== DaysOfTheWeek.MON){
    	console.log("Go to work");
    }
    
    console.log(day);
    
  • 接口interfaces

    //接口
    interface INamed{
        //属性
        name: string
        //方法
        print(name: string): void;
    }
    //函数
    const sayName = (o: INamed) =>{
    	console.log(o.name);
    }
    //对象
    const person = {
        age : 18,
        name : "yang"
        print: (name)=> {
            console.log(name)
        }
    }
    const school = {
        locate: beijing,
        name :guojiguanxi
    }
    //类
    class Person{
        name: string
        print(name: string): void{
            console.log(name);
        }
    }
    let aPerson = new Person();
    aPerson.name = "ke"
    sayName(person);
    sayName(school);
    sayName(aPerson);
    
    interface IPerson{
        name: string;
        
        greet(): void;
    }
    
    //类实现接口
    class Employee implements IPerson{
    	name: string;
        
        greet(): void{
            console.log("i am employee");
        }
    }
    //实例化
    let em=new Employee();
    em.greet();
    
    //another 类实现接口
    class Customer implements IPerson{
        public name: string;
        public email: string;
        
        greet(): void{
            console,log("i am customer");
        }
    }
    //another 实例化
    let cu = new Customer();
    cu.greet();
    
    //举一个支付的栗子eg
    
    
    //支付接口
    interface Pay{
        post(): void;
    }
    
    //可能会发送http请求
    //真正支付的请求
    const do_pay = (pay: Pay) => {
        pay.post();
    }
    
    //微信支付
    class WePay implements Pay{
        //调试微信支付的接口
        post(){
            
        }
    }
    
    //支付宝支付
    class AliPay implements Pay{
        //调试支付宝支付的接口
        post(){
            
        }
    }
    
    //其他的支付接口
    
    let we_pay: Pay = new WePat();
    let ali_pay: Pay = new AliPay();
    
    //微信支付
    do_pay(we_pay);
    //支付宝支付
    do_pay(ali_pay);
    
  • 接口可选/只读属性

    interface Person{
        //只读
    	readonly first_name: string
        //可选
        last_name?: string
    }
    
    let person = {
        first_name: "yu",
        //last_name:"xiaoyang" 接口有问号就是可要可不要
    }
    
    class Programmer implements Person{
    	first_name: string;
    }
    
    const programmer = new Programmer();
    programmer.first_name = "tony";
    
    const sayName = (o: Person) => {
        console.log(o.first_name);
    }
    
    sayName(person);
    sayName(programmer);
    
  • 类型断言

  • 继承与实现多个接口

    interface Person{
        name: string;
    }
    
    interface Employee{
        age: number;
    }
    
    //继承了接口Person的属性和方法
    interface Programmer extends Person{
    	age: number;
    }
    
    let p: Programmer = {
        age: 18,
        name: "xiaoyang"
    }
    
    //类不能继承多个类,也就是不能有多个父类
    //但是可以继承多个接口
    //每个接口的属性和方法都要实现
    class P implements Person,Employee {
    	name: string;
        age: number;
    }
    
    let p1: P = {
        name:"xiaoyang",
        age: 18
    }
    
  • 接口继承类

    class component{
        private width: number;
        private height: number;
        
        constructor(width: number,height: number){
            this.width = width;
            this.height = height;
        }
        
        display(): void{
            console.log('displaying');
        }
    }
    
    //接口继承类
    interface Width extends Compents{
        
    }
    
    class Button extends Component implements Widget{
    	
    }
    let w: Widget = new Button(1,2)
    console.log(w);
    w.display();
    
  • 接口-可索引类型-Indexable Types

    interface States{
    	[state: string]: boolean;
    }
    let s: States = {'enabled': true, 'ajsd': false}
    console.log(s);
    console.log(s["enabled"]);
    /*结果:
    	{enabled: true,ajsd: false}
    	true
    */
    
  • 处理列表数据

    //接口
    interface ToDo{
        userId: number;
        id: number;
        title: string;
        completed: boolean;
    }
    
    //类
    class Todo1{
        userId: number;
        id: number;
        title: string;
        completed: boolean;
    }
    
    //对象
    
    let todos: Todo = {
        "uesrID": 1,
        "id": 1,
        "title": "delectus aut autem",
        "completed": false
    }
    
    //对象
    let todos: ToDo[] = [
        {
            "userId": 1,
            "id": 1,
            "title": "delectus aut autem",
            "completed": false
        },
        {
            "userId": 1,
            "id": 2,
            "title": "quis ut nam facilis et officia qui",
            "completed": false
        },
        {
            "userId": 1,
            "id": 3,
            "title": "fugiat veniam minus",
            "completed": false
        }
    ]
    
    • 抽象类

      abstract class Person{
          name: string;
      
         /* constructor(name: string){
              this.name = name;
          }*/
          
          display(): void{
              console.log(this.name);
          }
          
          //抽象方法
          //没有方法体
          abstract find(string): Person;
      }
      
      //继承抽象类
      class Employee extends Person{
          name: string;
          empCode: number;
          
          constructor(name: string,code: number){
              super();//必须调用super
              this.name = name;
              this.empCode=code;
           }
          
          find(name: string): Person{
              return new Employee(name,1);
          }
          
      }
      
      let p: Person = new Employee('xiaoyang',18);
      let p1: Person =p.find('asidh11');
      console.log(p1);
      
    • constructor的简写

      class Person {
      	private _name: string;
      	private _age: number;
      
      	constructor(name: string, age: number) {
      		this._name = name;
      		this._age = age;
      	}
      }
      
      //等用于下面
      class Person{
          constructor(private _name: string,private _age: number){
              
          }
      }
      
    • get和set

      class Person{
          private name: string;
          private age: number;
          
          constructor(name: string,age: number){
              this.name=name;
              this.age=age;
          }
          
          //读取
          getName(): string{
              return this.name;
          }
          
          //设置
          setName(name: string): void{
              this.name = name;
          }
      }
      
      
      
  • 定义函数类型的五种方法

    //1
    let a: any;
    
    a = function(): void{
    	console.log('It work');
    }
    
    function fun(): any{
    	return function(): void{
    		console,log('It work');
    	}
    }
    
    //2
    let c: Function;
    
    c = function(): void{
    	console.log('It work');
    }
    
    //3
    let d:(para: string) => string;
    d = function(pass: string): string{
    	return pass;
    }
    
    //4
    typr e = (para: string) => string;
    
    const f: e = function(pass: string): sring{
    	return pass;
    }
    
    //5
    interface g{
    	(para: string): string;
    }
    
    const h:g = (pass: string) => pass;
    
  • 函数的重载

  • 类型判断typeof,instanceof,以及as断言

  • null和undefined

  • null 和 undefined 分别有自己的类型,分别是 null 和 undefined

    它们的值 null 和 undefined 分别可以赋值给很多类型,比如 string number 之类的,它们可以是很多类型的子类型

    let x: string = null;

  • never类型

    用于无限循环或者抛出异常,不期望有返回值。

  • 泛型

    function getArray<T>(items: T[]): T[] {
        return new Array<T>().concat(items);
    }
    
    
    let myNumArray = getArray<number>([100, 200, 300]);
    let myStrArray = getArray<string>(['hello', 'world']);
    
    
    myNumArray.push(400);
    myStrArray.push('rails365');
    
    
    class List<T>{
        private data: T[];
        
        constructor(elements: T[]){
            this.data = elements;
        }
        
        add(t: T){
            this.data.push(t);
        }
        
        remove(t: T){
    		let index = this.data.indexOf(t);
            if(index > -1){
                this.data.splice(index,1);
            }
        }
        
        asArray(): T[]{
            return this.data;
        }
    }
    
    //创建对象
    let numbers = new List<number>([1,2,3,4]);
    numbers.aa(5);
    numbers.remove(3);
    let numArray = numbers.asArray();
    console.log(numArray);
    
    
    
    //another eg
    class Pair<F, S> {
        private _first: F;
        private _second: S;
    
        constructor(first: F, second: S) {
            this._first = first;
            this._second = second;
        }
    
        get first(): F {
            return this._first;
        }
    
        get second(): S {
            return this._second;
        }
    }
    let pair = new Pair<boolean, string>(true, "111");
    console.log(pair.first);
    console.log(pair.second);
    
  • 泛型在函数中的应用

  • 泛型在接口中的应用

  • 泛型在索引性接口的应用

  • 拓展运算符

    // 1
    
    function foo(x: number, y: number, z: number) { 
        console.log(x, y, z);
    }
    var args: number[] = [0, 1, 2];
    
    // foo.apply(null, args);
    // foo.apply(void 0, args);
    
    (<any>foo)(...args);
    
    // 2
    
    function foo1(...x: number[]) { 
        console.log(JSON.stringify(x));
    }
    
    foo1(...args);
    foo1(1, 2, 3);
    
    // 3
    function foo2(...args: number[]): void;
    function foo2(x: number, y: number, z: number) { 
        console.log(x, y, z);
    }
    
    foo2(...args);
    
    foo2(1, 2, 3);
    
    // Destructuring
    
    var [x, y, ...remaining] = [1, 2, 3, 4];
    console.log(x, y, remaining);
    
    // Array Assignment
    
    var list = [1, 2];
    list = [...list, 3, 4];
    console.log(list);
    
    // Object spread
    
    const point2D = {x: 1, y: 2};
    const point3D = {...point2D, z: 3};
    console.log(point3D);
    
    const anotherPoint3D = {x: 5, z: 4, ...point2D};
    console.log(anotherPoint3D);
    
    const yetAnotherPoint3D = {...point2D, x: 5, z: 4}
    console.log(yetAnotherPoint3D);
    
    const foo4 = {a: 1, b: 2, c: 0};
    const bar = {c: 1, d: 2};
    
    const fooBar = {...foo4, ...bar};
    console.log(fooBar);
    
  • 泛型的约束

  • 类型别名

    type Name = string;
    
    let my_name: Name = "xiaoyang"
    
    
    
    type User={
    	name: string;
    	age: number
    }
    
    const user: User(IUser) = {
        name: "xiaoyang"
        age: 18
    }
    
    interface IUser{
    	name: string;
        age: number
    }
    
React笔记:
  • PropTypes可以验证数据类型
Home.propTypes = {
    name: PropTypes.string,
    age: PropTypes.number,
    user: PropTypes.object
};
  • DOM树

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YOAQ1V0Z-1594813894099)(C:\Users\Administrator\Desktop\ct_htmltree.gif)]

  • 无状态组件

    import React from 'react';
    
    const Header = (props) => {
      return (
        <div className="container">
          <div className="row">
            <div className="col-xs-1 col-xs-offset-11">
              <h1>Header</h1>
            </div>
          </div>
        </div>
      );
    };
    
    export default Header;
    
    • 父给子传值

      在直接把属性和具体值写在父中子页面内容里

    • 子给父传值

      父把动作方法传给子,子改变自身数据,通过动作方法回馈给父

    • 子与子传值

      父有state值,把值给子1;

      父把有返回值方法(含setState)给子2,子2把自己的值通过父给的方法回馈给父,父用setState改变了state值,从而改变了子1

          onChangeLinkName(newName){
              this.setState({
                  homeLink: newName
              })
          }
      
    • App.js

      import React ,{Component} from "react";
      import Header from './component/Header';
      import Home from './component/Home';
      
      
      class App extends Component {
          constructor() {
              super();
              this.state={
                  homeLink: "Company"
              }
          }
      
          onGreet(age){
              alert(age);
          }
      
          onChangeLinkName(newName){
              this.setState({
                  homeLink: newName
              })
          }
      
          render() {
              const user ={
                  name : "Anna",
                  hobbies : ["sports","Reading"]
              }
              return (
                  <div className="container">
                      <div className="row">
                          <div className="col-xs-1 col-xs-offset-11">
                              <Header homeLink={this.state.homeLink} />
                          </div>
                      </div>
                      <div className="row">
                          <div className="col-xs-1 col-xs-offset-11">
                              <h1>Hello !!</h1>
                          </div>
                      </div>
                      <div className="row">
                          <div className="col-xs-1 col-xs-offset-11">
                              <Home name={"Max"}
                                    age={12} user={user}
                                    greet={this.onGreet}
                                    changeLink={this.onChangeLinkName.bind(this)}
                                    initialName={this.state.homeLink}
                              />
                          </div>
                      </div>
                  </div>
              );
          }
      }
      
      export default App;
      
    • Header.js

      import React, { Component } from 'react';
      
      export default class Header extends Component {
          render() {
              return (
                  <div className="container">
                      <div className="row">
                          <div className="col-xs-1 col-xs-offset-11">
                              <h1>{this.props.homeLink}</h1>
                          </div>
                      </div>
                  </div>
              );
          }
      }
      
      
      
      /*该文件无生命周期,是无状态组件,简单写法如下:
      import React from 'react';
      
      const Header = (props) => {
          return (
              <div className="container">
                  <div className="row">
                      <div className="col-xs-1 col-xs-offset-11">
                          <h1>Header</h1>
                      </div>
                  </div>
              </div>
          );
      };
      
      export default Header;
      */
      
    • Home.js

      import React, { Component } from 'react';
      import PropTypes from 'prop-types';
      
      export default class Home extends Component {
          constructor(props) {
              super(props);
              this.state={
                  age: props.age,
                  homeLink: props.initialName
              }
              // this.age=this.props.age;     没有state时使用
          }
      
          onMakeOlder(){
              // this.age +=3;                没有state时使用
              this.setState({
                  age: this.state.age + 3,
              })
              console.log(this);
          }
      
          handleGreet(){
              this.props.greet(this.state.age)
          }
      
          onChangeLink(){
              this.props.changeLink(this.state.homeLink)
          }
      
          onHandleChange(event){
              this.setState({
                  homeLink: event.target.value
              })
          }
      
          render() {
              console.log(this.props);
              return (
                  <div className="container">
                      <div className="row">
                          <div className="col-xs-1 col-xs-offset-11">
                              <div>your name is {this.props.name},your age is {this.state.age}</div>
                              <button onClick={() =>{this.onMakeOlder()}} className="btn btn-primary">Make me older</button>
                              <hr/>
                              <button onClick={this.handleGreet.bind(this)} className="btn btn-primary">Greet</button>
                              {/*把父类中的爱好类出来
                              <div>
                                  <h4>hobbies</h4>
                                  <ul>
                                      {this.props.user.hobbies.map((hobby,i) => <li key={i}>{hobby}</li>)}
                                  </ul>
                              </div>*/}
                              <hr/>
                              <input type=" "
                                     defaultValue={this.props.initialName}
                                     value={this.state.initialName} onChange={(event) => this.onHandleChange(event)}/>
                              <button onClick={this.onChangeLink.bind(this)}
                                      className="btn btn-primary">Change Header Link</button>
                          </div>
                      </div>
                  </div>
              );
          }
      }
      
      Home.propTypes = {
          name: PropTypes.string,
          age: PropTypes.number,
          user: PropTypes.object,
          greet: PropTypes.func,
          initialName: PropTypes.string
      };
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值