【TypeScript语法测试】 包括安装、tsconfig配置及代码测试

已被阅读 764 次 | 文章分类:javascript | 2022-03-05 00:40

简单搭建了ts编译环境,整理下ts的语法;如果有java或者c#基础的;直接上项目也没问题的。有基础的话建议看看理解一下。

1 安装过程

                                            
(1)新建目录,然后在根目录下打开终端 输入命令 npm install -g typescript;

(2)安装好ts 后输入tsc -V 如果可以查看到ts的版本则说明安装成功

(3)输入命令 tsc --init 会在根目录下生成一个tsconfig.json配置文件

(4)打开配置文件,修改 outDir(输出文件夹,即编译后生成的.js存放的目录) 和 rootDir(输入文件夹,即ts存放的目录)两项

(5)运行tsc -w 即开启了监视,只要rootDir配置文件路径下面的 ts文件一发生改变 则会自动编译成.js文件存放到outDir配置的文件的文件夹下面;
                                            
                                        

2 工程目录

通过上述过程后,整个目录就一个.tsconfig文件;然后可以新建一个.ts文件;这里我们将输出目录修改为 "outDir": "./built"

                                            
"outDir": "./built",
                                            
                                        

其次输入命令tsc -w;即可开启监视;将我们的ts代码转换为js;下面是测试目录

/net/upload/image/20220305/7117824ce7bc4eb19632b9aa77191470.png

如图有10个ts文件,运行完监听命令后;修改其中任何一个ts文件,保存后都会重新转换成js

3 语法解释

将几种语法做了简单测试,主要有下面几个部分

3.1 变量定义

                                            
//  let 变量名:变量类型=值
let flag:boolean=true;
let num:number=123
                                            
                                        

3.2 函数定义

(1) 常规函数:所有参数必须传

                                            
// function fn(参数1:参数类型,参数2:参数类型):函数返回值类型{}

// 常规函数:必选参数
function getInfo(name:string,age:number):string{
    return `${name}---${age}`;
}
getInfo("xiaobai",5); // 正确
                                            
                                        

(2) 常规函数:可选参数

                                            
// function fn(参数1:参数类型,参数2?:参数类型):函数返回值类型{}

function getInfo1(name:string,age?:number):string{
    return `${name}---${age}`;
}
getInfo1("xiaobai",5); // 正确
getInfo1("xiaobai");// 正确
                                            
                                        

(3) 常规函数:默认参数

                                            
// function fn(参数1:参数类型,参数2=值):函数返回值类型{}

function getInfo2(name:string,age:number=33):string{
    return `${name}---${age}`;
}
getInfo2("xiaobai",5); // 正确
                                            
                                        

(4)常规函数:无返回值

                                            
// function fn(参数1:参数类型,参数2:值):void{}

 
function getInfo3(name:string,age:number):void{
    console.log(`${name}---${age}`);
}
getInfo3("xiaobai",5); // 正确
                                            
                                        

(5)剩余参数

                                            
// function fn(...参数:数组元素类型[]):返回值类型{}

function sum(...result: number[]): number {
    let sum = 0;
    for (let i = 0; i < result.length; i++) {
        sum += result[i];
    }
    return sum;
}
console.log(sum(1, 2, 3, 4, 5, 6));
                                            
                                        

还有一种带初始值的;如下

                                            
function sum1(init:number,...result: number[]): number {
    let sum = 0;
    for (let i = 0; i < result.length; i++) {
        sum += result[i];
    }
    return sum;
}
console.log(sum(100,1, 2, 3, 4, 5, 6));
                                            
                                        

(6) 重载函数:函数名称一样,参数个数不一样;调用哪一个取决于调用函数时传的参数个数

                                            
// 重载函数声明 
function czFn(name: string): string;
function czFn(name: string, age: number): string;
 
// 重载函数定义
function czFn(name: string, age?: string | number): string {
    if (age) {
        return "小白" + name + ",年龄:" + age;
    } else {
 
        return "小白" + name;
    }
}
czFn("zhangsan") // 正确
czFn("lisi", 20) // 正确
                                            
                                        

3.3 定义类

                                            
class 类名{
        访问修饰符 属性名:属性类型;

        constructor(参数名:参数类型){
                

        }

        访问修饰符 fn():返回值{
        }

}
                                            
                                        
                                            
// 定义类
class Person {
    public name: string;
    constructor(n: string) { 
        this.name = n;
    }
    public run(): void {
        console.log(this.name+ "在跑步");
    }
}
 
var p = new Person("xiaobai");
p.run();
                                            
                                        

3.4 类继承 子类继承父类:通过extends关键字和super方法实现;

                                            
// 父类
class Person1 {
    name: string;
    constructor(n: string) {
        this.name = n;
    }
    run(): void {
        console.log(this.name + "在跑步");
    }
}
// 子类
class Chinese extends Person1 {
    age: number;
    constructor(n: string, a: number) {
        super(n); // 使用super关键字调用父类中的构造方法
        this.age = a; 
    }
    speak(): void {
        super.run(); // 使用super关键字调用父类中的方法
        console.log(this.name + "说中文");
    }
}
 
var c = new Chinese("xiaobai", 5);
c.speak();
                                            
                                        

3.5 访问修饰符

访问修饰符在类继承的时候,用来设置属性和函数的访问范围

                                            
// public:公有类型,在当前类里面、子类、类外面都可以访问

// protected:保护类型,在当前类里面、子类里面可以访问,在类外部没法访问

// private:私有类型,在当前类里面可以访问,子类、类外部都没法访问
                                            
                                        
                                            
class Person2 {
    public name: string;
    protected age: number;
    private sex: string;
    constructor(n: string,a:number,s:string) {
        this.name = n;
        this.age = a;
        this.sex = s;
    }
    run(): void {
        console.log(this.name + "在跑步");
    }
}
 
var p2:Person2=new Person2("xiaobai",5,"男");
console.log(p2.name);  // 可访问
console.log(p2.age);   // 不可访问
console.log(p2.sex);   // 不可访问
                                            
                                        

3.6 静态修饰符

通过静态修饰符 修饰的属性或者方法,在类外面可以直接使用类名称调用

                                            
class Person3 {
    public name: string;
    static age:number=12;
   
    constructor(n: string) {
        this.name = n;
    }
    run(): void {
        console.log(this.name + "在跑步");
    }
    static getAge():void{
        console.log("年龄是",Person3.age);
    }
}
Person3.age // 12
Person3.getAge // 年龄是12
var p3:Person3=new Person3("xiaobai");
p3.run() // 小白在跑步
                                            
                                        

3.7 抽象类

抽象类,只能被继承,不能被实例化(new);用abstract声明

                                            
// 抽象类,只能被继承,不能被实例化(new)
abstract class Animal {
    name: string;
    constructor(name: string) {
        this.name = name;
    }
    run() {
        console.log(this.name + "会跑")
    }
}
 
 
class Dog extends Animal {
    constructor(name: string) {
        super(name);
    }
}
var d: Dog = new Dog("巴哥");
d.run();
 
 
 
class Cat extends Animal {
    constructor(name: string) {
        super(name);
    }
}
var cat: Cat = new Cat("花猫");
cat.run();
                                            
                                        

抽象类的多态性:

特点:相同的方法名,可以定义不同的方法主体; 使用方式:在抽象类中声明方法名,不实现方法体;每个派生类中可以自己去实现方法体;

                                            
// 多态:抽象类中声明一个共用方法;在不同的子类中分别定义实现
// 抽象类
abstract class Animal1 {
    name: string;
    constructor(name: string) {
        this.name = name;
    }
    abstract eat(): any; 
    run() {
        console.log(this.name + "会跑")
    }
}
 
// Dog1类
class Dog1 extends Animal1 {
    constructor(name: string) {
        super(name);
    }
    eat(): any { 
        console.log(this.name + "吃骨头");
    }
}
var d1: Animal1 = new Dog1("狗");
d1.eat();
 
// Cat1类
class Cat1 extends Animal1 {
    constructor(name: string) {
        super(name);
    }
    eat(): any {
        console.log(this.name + "吃老鼠");
    }
}
 
var c1: Animal1 = new Cat1("猫");
c1.eat();
                                            
                                        

3.8 接口类

特点:只负责定义方法和属性,不实现; 跟抽象类区别:接口类定义的方法和属性必须在子类中全部给他实现喽;如果派生类中漏实现一个是会报错的;所以接口类他定义的是一套规范;比如一个人体接口类;定义了基本的四肢和七窍;如果你少实现一个是会出问题的;

                                            
// 接口类:接口定义的事规范和约束;就是接口类中定义的属性和方法,在继承类中必须全部实现;如果缺项会报错
interface Animal2 {
    name: string;
    eat(str: string): void;
}
 
class Dog2 implements Animal2 {
    name: string;
    constructor(name: string) {
        this.name = name;
    }
    eat() {
        console.log(this.name + "吃骨头");
    }
}
 
var d2 = new Dog2("狗");
d2.eat();
 
class Cat2 implements Animal2 {
    name: string;
    constructor(name: string) {
        this.name = name;
    }
    eat(food: string) {
        console.log(this.name + "吃" + food);
    }
}
var c2 = new Cat2("猫");
c2.eat("鼠");
                                            
                                        

QQ:3410192267 | 技术支持 微信:popstarqqsmall

Copyright ©2017 xiaobaigis.com . 版权所有 鲁ICP备17027716号