HarmonyOS鸿蒙Next中ArkTS与Typescript的区别?

HarmonyOS鸿蒙Next中ArkTS与Typescript的区别?

1、什么是ArkTS?

ArkTS是鸿蒙生态的应用开发语言。

ArkTS提供了声明式UI范式、状态管理支持等相应的能力,让开发者以更简洁、更自然的方式开发应用。

同时,它在保持TS基本语法风格的基础上,进一步通过规范强化静态检查和分析,使得在程序运行之前的开发期能检测出更多错误,提升代码的健壮性,并实现更好的性能。

针对JS和TS并发能力支持有限的问题,ArkTS对并发编程API和能力进行了增强。

ArkTS支持与TS/JS高效互操作,兼容JS/TS生态。

2、ArkTS与TypeScript的关系?

ArkTS基于TypeScript的增强——规范的代码更好的保证正确性和性能,扩展语言特性增强UI声明式范式和并发能力支持。

TypeScript ArkTS
类型检查 可配置:开发人员可以使其更严格或更放松。风险:如果我们错误配置了类型检查器,那么静态类型带来的好处都将丧失 严格:不能放松或关闭类型检查。类型始终存在于代码中
编译 编译为JavaScript
编译后类型信息丢失
编译为字节码(特殊的运行时友好执行格式,如JVM或.NET
类型信息在编译后得到保留
执行 可以在任何能够运行JavaScript的引擎上运行(V8、JavaScriptCore等)
引擎在运行JavaScript代码期间执行所有必要的运行时类型检查
在ArkRuntime上运行
由于静态检查的加强,运行时类型检查的数量大大减少(与Java或C#的水平相同)

3、ArkTS和TypeScript的差异举例:

a、ArkTS中更严格的类型检查

// prog.ts  - 示例1
class C {
    n: number; // 在ArkTS中需要初始化
	s: string; // 在ArkTS中需要初始化
}
let c = new C();

// prog.ts  - 示例2
class C {
    n: number = 0;
	s: string = "";
}

let c: C = {
    n: 42, // @ts-ignore <-- 在ArkTS中禁止关闭类型检查
    s: null // 在ArkTS中报错(强化null-safety)
}

b、ArkTS不支持在运行时更改对象布局

// TypeScript代码
class C {
    n: number = 0;
	s: string = "";
}
let c = new C();
// 在ArkTS中,此处会报错
(c as any).newProperty = 'WOW';
// 在ArkTS中,此处会报错
delete (c as any).newProperty;

// ArkTS代码
class C {
    n: number = 0;
	s: string = "";
	newProperty?: string;
}
let c = new C();
// 为可选属性赋值
c.newProperty = 'WOW';
// 置空可选属性
c.newProperty = undefined;

c、ArkTS对象字面量需标注类型

// TypeScript代码
const area = {
    // 在ArkTS中,此处会报错
    pixels: new ArrayBuffer(8),
    offset: 0,
    stride: 8,
    region: {
        size: {
            width: 2,
            heght: 1
        },
        x: 0,
        y: 0
    }
}

// ArkTS代码
import image from '@ohos.multimedia.image';

// Arae类型确定,每个属性的类型也随之确定
interface PositionArea {
    pixels: ArrayBuffer;
    offset: number;
    stride: number;
    region: Region;
}

const area: image.PositionArea = {
    pixels: new ArrayBuffer(8),
    offset: 0,
    stride: 8,
    region: {
        size: {
            width: 2,
            heght: 1
        },
        x: 0,
        y: 0
    }
}

d、ArkTS禁止使用对象字面量初始化具有复杂constructor的类,在ArkTS中,如果需要创建这些class的实例,需要使用new操作符创建

// TypeScript代码
class C {
    n: number;
	s: string;
	constructor(n: numhber) {
        if (n<0) {
            throw new Error('Wrong number')
        }
        this.n = n;
        this.s = ""
    }
}

// 使用new创建对象,运行时异常
let c1: C = new C(-42);
// 使用对象字面量创建对象(n值为负数)
let c2: C = { // 在ArkTS中此处会报错
    n: -42,
    s: 'foo'
}
console.log(c2.n) // -42

e、ArkTS不支持使用对象字面量初始化具有方法的类,请使用new操作符创建类的实例或者将类中方法改为类的实例属性(类型为方法)

// TypeScript代码
class C {
    s: string = '';
	m() {
        console.log(this.s)
    }
}
let c1: C = { // 在ArkTS中此处会报错
    s: 'foo',
    m: () => {
        throw new Error();
    }
}

// ArkTS代码
class C {
    s: string = '';
	m = () => {
        console.log(this.s)
    }
}
let c: C = {
    s: 'foo',
    m: () => {
        throw new Error()
    }
}

f、ArkTS不支持structural typing

// TypeScript代码
class C {
    n: number = 0;
	s: string = '';
}
class D {
    b: boolean = false;
	n: number = 0;
	s: string = '';
}
function foo(c: C) {
    console.log(c.s)
}
foo(new D()); // ArkTS中此处将报错
// foo虽然声明参数是C,但是也可以传递D,这种灵活性往往不符合开发者的意图,容易带来程序行为正确性的问题。

// ArkTS代码
class C {
    n: number = 0;
	s: string = '';
}
class D {
    b: boolean = false;
	n: number = 0;
	s: string = '';
}
function fooC(c: C) {
    console.log(c.s)
}
function fooD(c: D) {
    console.log(c.s)
}
fooC(new C());
fooD(new D());
2 回复

ArkTS是HarmonyOS鸿蒙Next中基于TypeScript的扩展语言,专为鸿蒙应用开发设计。ArkTS在TypeScript的基础上增加了对鸿蒙系统特性的支持,如声明式UI、状态管理等。ArkTS的语法与TypeScript高度兼容,但提供了更多针对鸿蒙生态的API和组件。ArkTS还优化了性能,特别是在UI渲染和事件处理方面,以适应鸿蒙系统的分布式架构。TypeScript是一种通用的编程语言,而ArkTS则更专注于鸿蒙应用开发,提供了更高效的开发体验和更好的系统集成。

更多关于HarmonyOS鸿蒙Next中ArkTS与Typescript的区别?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,ArkTS是基于TypeScript的扩展,专为鸿蒙系统设计。主要区别在于:ArkTS增加了对鸿蒙系统特有API的支持,优化了性能以适应嵌入式设备,并提供了更严格的类型检查和运行时安全机制。此外,ArkTS还引入了鸿蒙特有的UI组件和状态管理机制,以提升开发效率和用户体验。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!