Skip to main content

定义

类似 JavaScript,一个 RowScript 程序的顶部(top level)包含任意数量的定义(definitions)。

常量定义

常量可使用 const 关键词来定义:

const a = 42;

也可以不使用任何名字绑定任意的表达式,如:

42;

这长得像是 JavaScript 中一般的语句(statement),但是实际上它只是以下结构的语法糖:

const _ = 42;

注意,在程序的顶部是不允许使用 let 定义的,也就是说,全局可变的定义是不支持的:

let a = 42; // ❌ invalid

// 可将可变状态封装在一个全局对象中。
const states = { // ✅ okay
a: 42
};

函数定义

RowScript 中的函数定义(functions)与 JS/TS 相似。

function f() {
}

你需要明确指定函数定义的返回类型,如果不明确指定返回类型,将不会进行任何类型推断,而是认为函数返回的是 unit 类型。

function f0() { // ❌ invalid
42
}

function f1(): number { // ✅ okay
42
}

用户不需要在函数的最后加上 return 语句。如果省略返回值,系统自动将其视为 unit 类型。

function f0(): number {
42
}

function f1(): unit {
const n = f0();
}

return 关键词保留在了后续的 控制结构 中用作提前的函数返回控制。

const f: (x: number) => number = x => x;

泛型函数

函数定义可以是泛型的,如同 TypeScript。

function id<T>(x: T): T {
x
}

另见泛型相关的高级用法(TODO)。

类型别名

类型别名(type alias)用于创建某个类型的“别名”,和 TypeScript 相似。

type ID = number;

type Person<T> = {
id: ID,
data: T
};

注意类型别名会让报错信息变得复杂,因为类型别名会在报错展示中 默认展开定义。并且别名类型可能会因为原始类型过度的能力而失去抽象的正确性,举个例子,对于 ID 类型来说以下功能应该是没有任何意义的,但是因为 number 的能力而导致了抽象的错误。

type ID = number;

const a: ID = 114;
const b: ID = 514;
const c = a + b; // ID 的相加并无实际意义

外部声明

JS 的全局环境往往是复杂多变的,在 globalThiswindow 中往往可能有一些普遍可用的函数定义(例如 jQuery 的 $)。我们可以使用外部声明(postulate)来定义已经存在的外部结构。通常这又叫做 FFI(foreign function interface)。

外部函数

外部函数(function postulate)用于定义外部已经存在的函数:

function foo();

虽然语法和 TypeScript 类似,但用户并不需要额外的 .d.ts 文件,也不需要 declare 关键字。

外部类型

外部类型(type postulate)用于定义外部已经存在的类型:

type Foo;

类定义

另见 章节。

接口定义

见 TODO。