Skip to content

Types and Strong Typing

Liu.Yandong.Hanks edited this page Aug 26, 2026 · 2 revisions

类型与强类型

export type 自定义形状、内置类型注解、编译器流分析与原生优化路径。

适用于 4.0.0

首页 · 语言指南 · Native 函数

Note

AuroraScript 仍是动态脚本语言。类型语法主要服务于编译器优化与边界检查,不会在运行时插入结构扫描或强制静态类型系统。

本页目录

概述

AuroraScript 在源码层不要求每个变量都写类型。编译器通过 flow 分析 推断稳定值的表示方式;作者可以在关键位置用类型语法帮助编译器:

机制 作用
export type 声明 compile-time 对象形状,授予字段原生推导
Number pBoolean b 等参数 内置类型的精确参数/返回契约
value as Type 运行时精确断言(内置类型)或授予形状(自定义类型)
func f() Number 声明返回类型,对动态返回值做精确检查
native func 显式函数 ABI,固定入口/出口

三者配合可在不牺牲动态语义的前提下,获得无分配数值循环与更安全的边界。

运行时类型模型

每个值在运行时仍有 kind(numberstringobjectarray 等)。typeof 报告类型名字符串;packed array 与部分内置对象报告构造函数名(如 "Int32Array""Path"),而非 "object"

运行时 kind 表与 typeof 示例见 语言指南 · 类型模型(概要)。宿主侧对应 ScriptDatum.TypeOf / ValueKind

自定义类型(export type

export type 声明 compile-time 形状(shape)。它不改变弱类型对象模型,不插入运行时结构校验。

语法

@module(MODELS);

export type Point {
    Number x;
    Number y;
}

export type Rect {
    Point origin;
    Number width;
    Number height;
}
  • 仅模块作用域;字段类型为内置类型名或其它已声明 shape。
  • export type 可通过模块别名在外部引用(如 models.Point)。
  • 模块内未导出的 type Internal { ... } 对外不可见。

授予形状(grant)

当值被授予某 shape 后,编译器将已知字段视为对应原生类型,属性读取可走快速路径:

授予方式 示例
参数 func add(Point p) Number { return p.x + p.y; }
as 断言 var p = value as Point;
声明返回 func origin() Point { return { x: 1, y: 2 }; }
对象字面量 sumPoint({ x: 2, y: 3 }) 在参数为 Point 时自动授予

局部变量仅在所有分支赋予同一 shape 时保留形状;混合分支会擦除 compile-time 事实。

嵌套与导入

// models.as
export type Point { Number x; Number y; }

// main.as
import models from "./models";

func distance(models.Point p) Number {
    return p.x * p.x + p.y * p.y;
}
  • 嵌套字段(如 rect.origin.x)继续推导,运行时仍是普通对象。
  • 环形 shape(自引用或相互引用)同样允许;编译器仍不在运行时校验自定义 shape 的字段完整性。
export type Node {
    Number value;
    Node next;
}

export func tailValue(Node node) Number {
    return node.next.value;
}
export type Left { Number value; Right other; }
export type Right { Number value; Left other; }
  • models.Pointcompile-time 限定符,不能作为值(return models.Point 编译失败)。
  • models.addmodels.originX 等普通导出仍正常访问。

运行时行为

自定义 shape 不做运行时字段完整性或类型匹配检查:

  • 缺字段或错误类型字段按普通弱类型 coercion 处理(例如算术可能得 NaN)。
  • 仅内置 CheckedTypeNumberBoolean、packed array 等)在参数、as 与声明返回处做精确运行时检查

内置类型注解

参数与返回

export func add(Number a, Number b) Number {
    return a + b;
}

export func increment(value) {
    var n = value as Number;
    return n + 1;
}
  • NumberBooleanString、通用 Array、packed array 等可用于参数与返回声明。
  • 传入不兼容值时,运行时抛出 AuroraRuntimeException(精确检查)。
  • 声明返回 Number 但返回动态不兼容值时同样失败;裸 return; 返回 null,与 Number 不兼容。

as 断言

var bytes = payload as UInt8Array;
var n = value as Number;
var p = value as Point;  // 授予 shape,非运行时扫描
  • 内置类型:as Numberas Int32Array 等做精确运行时检查。
  • 自定义 shape:as Point 授予 compile-time 形状,不验证对象结构。

强类型路径(流分析)

编译器在能证明语义安全时,将稳定值保持在 原生 CIL 表示doubleboolint、packed 存储),避免 ScriptDatum 装箱。

保留快速路径:

  • 单一种类的数值/boolean 局部变量与循环归纳变量
  • 已知 packed array 局部变量及直接索引
  • 已授予 shape 的字段读取(如 p.xNumber
  • 同模块内证明兼容的 native func 调用

回退到动态路径:

  • 值存入通用 object、经未知属性读取、传给未知宿主回调
  • 以不相关 kind 重新赋值
  • packed array 放入 object 后再读回(擦除元素类型)
func sum(values) {
    var total = 0;
    var count = values.length;
    for (var i = 0; i < count; i++) {
        total += values[i];
    }
    return total;
}

编写建议与基准数据见 性能与基准测试

与 Native 函数的关系

  • 流分析优化函数内部局部变量与运算。
  • export type 优化对象字段读取的 compile-time 事实。
  • native func 优化函数入口/出口与跨模块调用 ABI。

三者可组合:带 Point 参数的 native func 可在 $native 中对 p.x + p.y 发射原生算术(见引擎测试 PointFieldArithmeticEmitsNativeKernel)。

限制与常见误区

限制 说明
类型非值 不能把 models.Point 当作运行时对象或构造函数
非导出不可导入 跨模块须使用 export type
非静态类型系统 错误 shape 的对象不会在运行时因「不是 Point」而拒绝
与 TDoc 分工 持久化精确 64 位等场景用 TDoc;shape 用于 compile-time 优化
native func 分工 需要固定 ABI 或不可热补丁时用 Native 函数

Tip

4.0 已移除 @directCall 函数注解。请用 native func 声明显式原生 ABI。

示例

自定义 shape + 跨模块

// models.as
@module(MODELS);
export type Point { Number x; Number y; }
export func add(Point p) Number { return p.x + p.y; }

// main.as
@module(APP);
import models from "./models";

export func run(value) Number {
    var p = value as models.Point;
    return models.add(p);
}

嵌套 shape

export type Rect {
    Point origin;
    Number width;
}

export func left(Rect rect) Number {
    return rect.origin.x;
}

shape + native 内核

export type Point { Number x; Number y; }

native func sumPoint(Point p) Number {
    return p.x + p.y;
}

export func run() Number {
    return sumPoint({ x: 2, y: 3 });
}

环形 shape(链表)

export type Node {
    Number value;
    Node next;
}

export func walk(Number total, Node node) Number {
    if (node == null) return total;
    return walk(total + node.value, node.next);
}

后续步骤

Clone this wiki locally