Arkts和Typescript语法上差别

目录

ArkTs

基础语法介绍

语法差别

具体案例

不支持通过注释类型检查。

对象字面量须标注类型

显示初始化类的属性

不支持‌Structural Typing‌

不支持Symbol()API

禁止使用var声明变量

禁止使用any和unknow约束类型

类型、命名空间的命名必须唯一

允许json中的科学技术法数字格式

应用环境限制

this使用

 具体语法限制

 no-func-apply-call

no-any-unknown

no-call-signature

no-ctor-signatures-type

no-ctor-signatures-iface

no-ctor-signatures-funcs

no-classes-as-obj

no-indexed-signatures

no-mapped-types

 no-in

no-for-in

no-typing-with-this

no-untyped-obj-literals

 no-obj-literals-as-types

no-method-reassignment 

no-polymorphic-unops

no-type-query

no-destruct-assignment

no-spread

no-types-in-catch

limited-throw

limited-stdlib

no-tsdeps 

no-func-props


ArkTs

鸿蒙开发使用的语言,Typescript语言的超集。跟ts一样是静类型态语言,所有数据的类型都必须在编译时确定。文件以ets后缀结尾。在ts的基础上加入了结构体struct的定义以及一些定义好了的UI组件和装饰器。基本语法和ts一致。

基础语法介绍

文档中心

语法差别

文档中心

总体语法和Typescript的基本一致,主要区别在于

1.添加了一些限制去明确类型,例如不支持泛型、常量使用需要标注类型以及this使用等限制。

2.限制了类型、接口的灵活写法,比如接口不能直接定义函数、不能通过[]定义对象属性等,推荐大家使用Typescript中定义好的一些类型函数,例如Record<>等。

3.简化了一些类型定义流程,例如构造函数类型定义去除了new操作符等。

4.限制了操作符等一些灵活的写法,比如禁止使用in、for in、apply、call等操作符和函数。

具体案例

文档中心

不支持通过注释类型检查。

ArkTS不支持通过注释的方式绕过严格类型检查。首先将注释(// @ts-nocheck或者// @ts-ignore)删去,再根据报错信息修改其他代码。

对象字面量须标注类型

原因:如果编译器不知道变量point的确切类型,由于对象布局不能确定,编译器无法深度地优化这段代码,造成性能瓶颈。没有类型也会造成属性的类型缺少限制,例如point.x的类型在此时为number,它也可以被赋值成其他类型,造成额外的运行时检查和开销。

注意只有对象字面量需要标注类型,基础变量是不需要的,会隐式的进行类型推断

let point = { x: 0,y: 0} //编译时报错,需要标注类型


Interface Point {
    x: number,
    y: number
}
let point:Point = { x: 0,y: 0} // 不会报错
let hi = 'hello, world'; //不会报错

显示初始化类的属性

类的属性初始化赋值或者在构造函数里赋值。相当于设置了tsconfig.json中的strictPropertyInitialization为true。

class Person {
  name: string; // 这里arkts类型检测会报错,需要显性进行赋值。
}

new Person()//name为undefined
// 正确
class Person1 {
  name: string='';
}
interface I {
  name:string
}
class A {}
class Test {
  a: number;
  b: string;
  c: boolean;
  d: I = { name:'abc' };
  e: A | null = null;
  constructor(a:number, b:string, c:boolean) {
    this.a = a;
    this.b = b;
    this.c = c;
  }
}

不支持‌Structural Typing‌

Structural Typing是一种类型系统,它允许根据对象的结构(属性和方法)而不是其类型来处理对象。

注意:规定类型为C,C的子集是可以传入的,C的父集不行

class C{
    s:string = ''
}
class D{
    n:number=0
    s:string = ''
}
function foo(c:C){
    console.log(c.s)
}
foo(new D()) // 在arkts中编译会报错,不允许传入其他类型的变量,即使这个类型的属性满足要求。

原因:foo虽然声明参数类型是C,但也可以传递类型D的变量,这种灵活性可能不符合开发者的意图,容易带来程序行为的正确性问题。另外,由于类型D和类型C布局不同,那么foo中对c.s这个属性访问就不能被优化成根据固定偏移量访问的方式,从而给运行时性能造成瓶颈。

不支持Symbol()API

TypeScript中的Symbol()API用于在运行时生成唯一的属性名称。由于该API的常见使用场景在静态类型语言中没有意义,因此,ArkTS不支持Symbol()API。在ArkTS中,对象布局在编译时就确定了,且不能在运行时被更改。

ArkTS只支持Symbol.iterator

禁止使用var声明变量

禁止使用any和unknow约束类型

类型、命名空间的命名必须唯一

// 错误
let X: string
type X = number[] // 类型的别名与变量同名,报错

允许json中的科学技术法数字格式

标准TS/JS中,JSON的数字格式,小数点后必须跟着数字,如2.e3这类科学计数法不被允许,报出SyntaxError。在方舟运行时中,允许使用这类科学计数法。

应用环境限制

  1. 强制使用严格模式(use strict)
  2. 禁止使用eval()
  3. 禁止使用with() {}
  4. 禁止以字符串为代码创建函数

this使用

  • 关键字this只能在类的实例方法中使用(在函数和类的静态方法中无法使用)。
内容概要:本文详细介绍了基于FPGA的144输出通道可切换电压源系统的设计实现,涵盖系统总体架构、FPGA硬件设计、上位机软件设计以及系统集成方案。系统由上位机控制软件(PC端)、FPGA控制核心高压输出模块(144通道)三部分组成。FPGA硬件设计部分详细描述了Verilog代码实现,包括PWM生成模块、UART通信模块温度监控模块。硬件设计说明中提及了FPGA选型、PWM生成方式、通信接口、高压输出模块保护电路的设计要点。上位机软件采用Python编写,实现了设备连接、命令发送、序列控制等功能,并提供了一个图形用户界面(GUI)用于方便的操作配置。 适合人群:具备一定硬件设计编程基础的电子工程师、FPGA开发者及科研人员。 使用场景及目标:①适用于需要精确控制多通道电压输出的实验环境或工业应用场景;②帮助用户理解掌握FPGA在复杂控制系统中的应用,包括PWM控制、UART通信及多通道信号处理;③为研究人员提供一个可扩展的平台,用于测试验证不同的电压源控制算法策略。 阅读建议:由于涉及硬件软件两方面的内容,建议读者先熟悉FPGA基础知识Verilog语言,同时具备一定的Python编程经验。在阅读过程中,应结合硬件电路图代码注释,逐步理解系统的各个组成部分及其相互关系。此外,实际动手搭建调试该系统将有助于加深对整个设计的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值