当前位置: 首页 > wzjs >正文

静态网站分页做湲兔费网站视颍

静态网站分页,做湲兔费网站视颍,做网站4核是什么意思,人流医院网站建设前言 臭宝们,今天我们来学习ArkTS中最后的一些内容。 实现接口 包含implements子句的类必须实现列出的接口中定义的所有方法,但使用默认实现定义的方法除外。 interface DateInterface {now(): string; } class MyDate implements DateInterface {no…

前言

臭宝们,今天我们来学习ArkTS中最后的一些内容。

实现接口

包含implements子句的类必须实现列出的接口中定义的所有方法,但使用默认实现定义的方法除外。

interface DateInterface {now(): string;
}
class MyDate implements DateInterface {now(): string {// 在此实现return 'now';}
}

接口属性

接口属性可以是字段、getter、setter或getter和setter组合的形式。

interface Style {color: string;
}

接口继承

接口可以继承其他接口,如下面的示例所示:

interface Style {color: string;
}interface ExtendedStyle extends Style {width: number;
}

注意:继承接口包含被继承接口的所有属性和方法,还可以添加自己的属性和方法。

抽象类和接口

在上一节中,我们介绍了如何在ArkTS中使用抽象类。抽象类与接口都无法实例化。抽象类是类的抽象,抽象类用来捕捉子类的通用特性,接口是行为的抽象。在ArkTS中抽象类与接口的区别如下:

  • 一个类只能继承一个抽象类,而一个类可以实现一个或多个接口;
  • 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
  • 抽象类里面可以有方法的实现,但是接口完全都是抽象的,不存在方法的实现;
  • 抽象类可以有构造函数,而接口不能有构造函数。

泛型在接口和类中的应用

class CustomStack<Element> {public push(e: Element):void {// ...}
}

要使用类型CustomStack,必须为每个类型参数指定类型实参:

let s = new CustomStack<string>();
s.push('hello');

编译器在使用泛型类型和函数时会确保类型安全。参见以下示例:

let s = new CustomStack<string>();
s.push(55); // 将会产生编译时错误

泛型约束

泛型类型的类型参数可以被限制只能取某些特定的值。例如,MyHashMap<Key, Value>这个类中的Key类型参数必须具有hash方法。

interface Hashable {hash(): number;
}
class MyHashMap<Key extends Hashable, Value> {public set(k: Key, v: Value) {let h = k.hash();// ...其他代码...}
}

在上面的例子中,Key类型扩展了Hashable,Hashable接口的所有方法都可以为key调用。

泛型函数

function last(x: number[]): number {return x[x.length - 1];
}
last([1, 2, 3]); // 3

如果需要为任何数组定义相同的函数,使用类型参数将该函数定义为泛型:

function last<T>(x: T[]): T {return x[x.length - 1];
}

现在,该函数可以与任何数组一起使用。

在函数调用中,类型实参可以显式或隐式设置:

// 显式设置的类型实参
last<string>(['aa', 'bb']);
last<number>([1, 2, 3]);// 隐式设置的类型实参
// 编译器根据调用参数的类型来确定类型实参
last([1, 2, 3]);
last(['aa', 'bb']);

泛型默认值

泛型类型的类型参数可以设置默认值。这样可以不指定实际的类型实参,而只使用泛型类型名称。下面的示例展示了类和函数的这一点。

class SomeType {}
interface Interface <T1 = SomeType> { }
class Base <T2 = SomeType> { }
class Derived1 extends Base implements Interface { }
// Derived1在语义上等价于Derived2
class Derived2 extends Base<SomeType> implements Interface<SomeType> { }function foo<T = number>(): T {// ...
}
foo();
// 此函数在语义上等价于下面的调用
foo<number>();

空安全

在ArkTS中,ArkTS中的所有类型都是不可为空的,在下面的示例中,所有行都会导致编译时错误:

let x: number = null;    // 编译时错误
let y: string = null;    // 编译时错误
let z: number[] = null;  // 编译时错误

可以为空值的变量定义为联合类型T | null。

let x: number | null = null;
x = 1;    // ok
x = null; // ok
if (x != null) { /* do something */ }

非空断言运算符(!)

后缀运算符!可用于断言其操作数为非空。

应用于可空类型的值时,它的编译时类型变为非空类型。例如,类型将从T | null更改为T:

class A {value: number = 0;
}function foo(a: A | null) {a.value;   // 编译时错误:无法访问可空值的属性a!.value;  // 编译通过,如果运行时a的值非空,可以访问到a的属性;如果运行时a的值为空,则发生运行时异常
}

空值合并运算符(??)

空值合并二元运算符??用于检查左侧表达式的求值是否等于null或者undefined。如果是,则表达式的结果为右侧表达式;否则,结果为左侧表达式。

换句话说,a ?? b等价于三元运算符(a != null && a != undefined) ? a : b。

在以下示例中,getNick方法如果设置了昵称,则返回昵称;否则,返回空字符串:

class Person {// ...nick: string | null = null;getNick(): string {return this.nick ?? '';}
}

可选链

在访问对象属性时,如果该属性是undefined或者null,可选链运算符会返回undefined。

class Person {nick: string | null = null;spouse?: PersonsetSpouse(spouse: Person): void {this.spouse = spouse;}getSpouseNick(): string | null | undefined {return this.spouse?.nick;}constructor(nick: string) {this.nick = nick;this.spouse = undefined;}
}

模块

程序可划分为多组编译单元或模块。

每个模块都有其自己的作用域,即,在模块中创建的任何声明(变量、函数、类等)在该模块之外都不可见,除非它们被显式导出。

与此相对,从另一个模块导出的变量、函数、类、接口等必须首先导入到模块中。

导出

可以使用关键字export导出顶层的声明。

未导出的声明名称被视为私有名称,只能在声明该名称的模块中使用。

export class Point {x: number = 0;y: number = 0;constructor(x: number, y: number) {this.x = x;this.y = y;}
}
export let Origin = new Point(0, 0);
export function Distance(p1: Point, p2: Point): number {return Math.sqrt((p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y));
}

导入

导入声明用于导入从其他模块导出的实体,并在当前模块中提供其绑定。导入声明由两部分组成:

  • 导入路径,用于指定导入的模块;
  • 导入绑定,用于定义导入的模块中的可用实体集和使用形式(限定或不限定使用)。

假设模块具有路径“./utils”和导出实体“X”和“Y”。

导入绑定* as A表示绑定名称“A”,通过A.name可访问从导入路径指定的模块导出的所有实体:导入绑定可以有几种形式。

import * as Utils from './utils';
Utils.X // 表示来自Utils的X
Utils.Y // 表示来自Utils的Y

导入绑定{ ident1, …, identN }表示将导出的实体与指定名称绑定,该名称可以用作简单名称:

import { X, Y } from './utils';
X // 表示来自utils的X
Y // 表示来自utils的Y

如果标识符列表定义了ident as alias,则实体ident将绑定在名称alias下:

import { X as Z, Y } from './utils';
Z // 表示来自Utils的X
Y // 表示来自Utils的Y
X // 编译时错误:'X'不可见

动态导入

应用开发的有些场景中,如果希望根据条件导入模块或者按需导入模块,可以使用动态导入代替静态导入。

import()语法通常称为动态导入(dynamic import),是一种类似函数的表达式,用来动态导入模块。以这种方式调用,将返回一个promise。

如下例所示,import(modulePath)可以加载模块并返回一个promise,该promise resolve为一个包含其所有导出的模块对象。该表达式可以在代码中的任意位置调用。

// Calc.ts
export function add(a:number, b:number):number {let c = a + b;console.info('Dynamic import, %d + %d = %d', a, b, c);return c;
}// Index.ts
import("./Calc").then((obj: ESObject) => {console.info(obj.add(3, 5));  
}).catch((err: Error) => {console.error("Module dynamic import error: ", err);
});

如果在异步函数中,可以使用let module = await import(modulePath)。

// say.ts
export function hi() {console.log('Hello');
}
export function bye() {console.log('Bye');
}
async function test() {let ns = await import('./say');let hi = ns.hi;let bye = ns.bye;hi();bye();
}

this 关键字

关键字this只能在类的实例方法中使用。

class A {count: string = 'a';m(i: string): void {this.count = i;}
}

使用限制:

  • 不支持this类型
  • 不支持在函数和类的静态方法中使用this
class A {n: number = 0;f1(arg1: this) {} // 编译时错误,不支持this类型static f2(arg1: number) {this.n = arg1;  // 编译时错误,不支持在类的静态方法中使用this}
}function foo(arg1: number) {this.n = i;       // 编译时错误,不支持在函数中使用this
}

关键字this的指向:

  • 调用实例方法的对象
  • 正在构造的对象

结尾

至此,我们已经学习了ArkTS的基础语法。下一步,我们将学习ArkUI框架。臭宝们,冲鸭!


文章转载自:

http://oGThlKJb.sypby.cn
http://tOz3mInk.sypby.cn
http://tK7vVV9Z.sypby.cn
http://56vSTywg.sypby.cn
http://qlODeYdY.sypby.cn
http://QVLnEFY5.sypby.cn
http://7QKnTJqg.sypby.cn
http://ZN2Q1O8k.sypby.cn
http://ml0imqjG.sypby.cn
http://tmNA9gPs.sypby.cn
http://NpReIIDs.sypby.cn
http://dQTdnJYG.sypby.cn
http://OheWNWQk.sypby.cn
http://BsgNT69D.sypby.cn
http://Ik8gwLeG.sypby.cn
http://cRCgDYsR.sypby.cn
http://BTEUDIN0.sypby.cn
http://9zhj75At.sypby.cn
http://ATGdF1PU.sypby.cn
http://J8CYsJmG.sypby.cn
http://gdjtuyBH.sypby.cn
http://cRNGaeB0.sypby.cn
http://biFrje6U.sypby.cn
http://vt32nnUC.sypby.cn
http://BRUER1J8.sypby.cn
http://hQ8pATkx.sypby.cn
http://NJdWfZn3.sypby.cn
http://gMNXSCos.sypby.cn
http://LeRfD0UH.sypby.cn
http://qTTO9UWK.sypby.cn
http://www.dtcms.com/wzjs/735322.html

相关文章:

  • dede怎么做网站seo网站推广如何做
  • 电脑网站建设在哪里网站制作价格权威乐云践新
  • 烟台网站公众号制作wordpress cdn代码
  • 南沙手机网站建设网站调研方法有哪些内容
  • 蛙蛙写作网站最新商城系统
  • 大连零基础网站建设教学公司wordpress404页面更爱
  • 河南新蔡有做网站建设的吗如何做电商直播
  • 河南网站建设优化推广网页毕业设计论文
  • 1网站建设公司做图标去什么网站找
  • 新站整站快速排名河南郑州网站制作公司
  • 开发网站的硬件成本如何做亚马逊跨境电商
  • 网站建设与管理课程心得体会越秀五屏网站建设
  • 工业设备网站源码域名备案后网站打不开
  • 广西工程建设质量管理协会网站丹阳建站推广管理
  • 静态网站如何建设wordpress pinterest
  • 网站建设经典范例wordpress怎么设置水印
  • 上海php网站开发公司国产安卓开发工具
  • 做网站被网警找做3D打印样品用什么外贸网站好
  • 网站外包公司有哪些青岛做网站公司排名
  • 网站建设怎么购买空间成都微信小程序分类信息开发
  • 科技网站设计欣赏装饰工程投标书
  • 镇江网站建设联系思创设计公司企业定位
  • 阿里 网站建设河北沧州市网络公司
  • 嘉兴网站推广公司个人建站赚钱
  • python做网站有什么弊端在网上做广告怎么做
  • 个人免费开店的网站免费咨询律师的电话
  • 自己做网站需要固定ip吗如何选择网站开发语言
  • 云网站建设017年青大学网站建设招标
  • 广东网站se0优化公司深圳餐饮公司网站制作
  • perl 网站开发网站开发需求报告