语法

EaseScript 是基于 JavaScript 语法,强化了面向对象的封装,在语法上弱有些改动并限制了对prototype的操作,这是因为EaseScript需要考虑到其它目标语言的兼容,所以有部分的语法暂不被支持。

以下是EaseScript与JavaScript差异化部分的介绍,如果需要了解全部的语法请查看JavaScript文档。

不支持的语法

yield

yield*

function* 生成器函数

const MyClass = class {} 表达式类暂不支持

关键字

package

声明命名空间,定义在文档的开头。命名空间的标识符应该相对于工作目录的路径,每个都目录名对应为空间名。

语法:package [标识符]; 如果不指定标识符则为全局。

行内声明:

package com;
class Person{}

块级声明:

package com{  
    class Person{} 
}

以上两种方式都是声明了在 com 空间中定义了 Person 类

public

定义类或者成员属性访问权限为公开,类或者成员属性隐式声明为public。

注意:在类上定义时只能为public。

public class Person{
    public name:string= ‘zhangsan’
}

protected

定义成员属性或者方法权限为受保护的,对外不可访问子类和本类可访问。

注意:不能在类上声明。

public class Person{
    protected name:string= ‘zhangsan’
}

private

定义类或者成员属性访问权限为私有,对外或者继承中不可访问仅本类中可访问。

注意:不能在类上声明。

public class Person{
    private name:string= ‘zhangsan’
}

import

import 导入一个类, 或者导入资源文件(.js, .css, …)

import com.Person //导入 Person 类 
import "index.css" //导入index.css 文件 
import * as V from "vue" //导入vue 到 V 的变量中 
import {ref} from "vue" //导入vue 中的ref

implements

实现一个或者多个接口

语法:implements 接口标识符[, ...接口标识符] 

interface

定义一个接口

语法:[public] interface [标识符] [extends 标识符] [implements 标识符, ... ]

class

定义一个类

语法:[public] class [标识符] [extends 标识符] [implements 标识符, ... ]

class Person extends Human implements IWorker,IHappy{
    name:string
    protected address:string
    private phone:number
    constructor(name:string){
        this.name=name;
        this.phone = 123456789;
        this.address = "sh";
    }
}

type

在块级中声明类型。在编译器不能准确推导一个想要的类型时就可以用type来声明一个类型。type又称缩短类型,类型声明后只当类型引用不会被构建在代码中。

class Person{
    name:string
    constructor(name){
        this.name = name; //这里的name是any类型,可以赋值给任何类型
        type T1 = typeof this.name; //从一个表达式中引用类型并赋值给T1
        const str:T1 = 'right'; //类型检查通过
        //const str:T1 = 123; //类型检查不通过,因为T1引用类型是字符串,而赋值的类型是数字。
    }
}

运算符

is

判断一个对象是否属于某个类型与instanceof类似,is可以判断指定的接口。

interface Human{
    name():string
}
class Person implements Human{
    private _name:string;
    constructor(name:string){
        this._name =  name;
    }
    name(){
        console.log(this._name);
    }
}
const person = new Person('ZhangSan')
if(person is Human){
    person.name() //output: ZhangSan
}

基础类型

在开发中为每一个属性或者变量定义正确的类型尤为重要,当然编译器也会为我们尽可能的推导出正确的类型,但还是推荐明确定义类型,这样可以增强代码的阅读性和IDE友好提示。

定义方法的返回类型为"string"

declare interface Human{
    name():string
}

定义函数的参数及返回类型为"string"

declare type env = (name:string)=>string

泛类型

泛类型是根据传入的参数或者指定的约束类型来推导出一个新的类型。

泛类型是定义在尖括号成对的里面即:“<T=string>”声明了一个为“T=string”的泛类型并默认分配了string类型, 当然也可以使用 extends 关键字对 “T” 类型进行约束即:“T extends string”那么传入进来的参数必须为 string 类型。

泛类型可以定义在类名、方法名、函数名和类型定义上。

class Person<T extends string>{
    constructor(name:T)
    realName<R=any>(name:R):R
    set name(value:T):void;
}

在类型上的定义

declare class Person<T extends string>{
    getAll():Person<string>[];
    getAppointPerson(name:'zs'|'ls'|'ww'):Person<string>[];
}
declare type IGetAllPerson<T> = ()=>Person<T>[]
declare const getAppointPerson:IGetAllPerson<'zs'|'ls'|'ww'>
declare const getAllPerson:IGetAllPerson<string>