# @edgerules/portable 中文文档

规范地址：https://npmcn.com/package/%40edgerules/portable/

版本：0\.2\.8-alpha\.202611121551
npm 元数据更新时间：2026-11-12T15:53:21.513Z
中文译文更新时间：2026-11-13T06:47:10.904Z
软件包许可：未声明

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40edgerules/portable
原文对照：https://npmcn.com/package/%40edgerules/portable/?lang=original

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：41.7 kB，4 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- 运行依赖：0 个
- 首次发布：2026-07-04T12:29:38.093Z
- 最新版本发布：2026-11-12T15:53:21.189Z
- 近 30 天下载量：2906（2026-10-13 至 2026-11-11，npm 官方下载统计）
- 已发布版本数：35（近 12 个月 35 个）

## 中文简介

边缘规则的便携式JSON类型定义.

## 安装

```sh
npm install @edgerules/portable
```

也可以使用：`pnpm add @edgerules/portable`、`yarn add @edgerules/portable`、`bun add @edgerules/portable`

## README

# @ edgerules/ 便携式

[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=rimvydasb_edgerules&metric=alert_status&token=98a392e505393c255f7de845e8b74a32911f2435)](https://sonarcloud.io/summary/new_code?id=rimvydasb_edgerules) [![Bugs](https://sonarcloud.io/api/project_badges/measure?project=rimvydasb_edgerules&metric=bugs&token=98a392e505393c255f7de845e8b74a32911f2435)](https://sonarcloud.io/summary/new_code?id=rimvydasb_edgerules) [![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=rimvydasb_edgerules&metric=code_smells&token=98a392e505393c255f7de845e8b74a32911f2435)](https://sonarcloud.io/summary/new_code?id=rimvydasb_edgerules) [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=rimvydasb_edgerules&metric=coverage&token=98a392e505393c255f7de845e8b74a32911f2435)](https://sonarcloud.io/summary/new_code?id=rimvydasb_edgerules) [![Duplicated Lines](https://sonarcloud.io/api/project_badges/measure?project=rimvydasb_edgerules&metric=duplicated_lines_density&token=98a392e505393c255f7de845e8b74a32911f2435)](https://sonarcloud.io/summary/new_code?id=rimvydasb_edgerules)

脚本类型定义 **边缘规则可移植 JSON 格式** - 犬科序列化计划 边缘规则模型、函数、类型和错误.

此软件包具有 TypeScript 类型和一个运行时常数, `Kinds`: 常见 `@kind` 组别 `service.get(path, kinds?)`。在浏览器和Node.js项目中都可以安全使用.

* * *

## 安装

```sh
npm install @edgerules/portable
```

* * *

## 什么是便携式JSON?

每个边缘规则模型都是平坦的JSON对象. 便携式格式是您如何在数据库中存储一个模型, 发送到 HTTP,并传递给 `DecisionService` ——没有专门的系列化库.

-   每个对象节点都有一个 `@kind`。仅限 `@kind`, (中文(简体) ), `@node`,以及 `@name` 拥有 `@` 前缀.
-   样板根是 `PortableContext`数字 : `{ '@kind': 'context', fields: { ... } }`。 。 。 .
-   机构声明有一个紧凑的接口节点(`*-interface`没有尸体.

| `@kind` | 类型脚本 | 说明 |
| --- | --- | --- |
| `context`, (中文(简体) ), `workbook` | `PortableContext` | 记录 `fields`页:1 `workbook` 仅为根 |
| `placeholder` | `PortablePlaceholderValue` | 输入槽——主机供应值 |
| `expression`, (中文(简体) ), `expression-interface` | `PortableExpression`, (中文(简体) ), `PortableExpressionInterface` | 以其 `variables` |
| `invocation` | `PortableInvocation` | 调用模型中的用户方法 |
| `type` | `PortableType` | 用户定义类型 : `fields` 或者说 `alias` |
| `facts` | `PortableFacts` | 结构类型的衍生字段 |
| `method`, (中文(简体) ), `method-interface` | `PortableMethod`, (中文(简体) ), `PortableMethodInterface` | `func`数字 : `parameters`, (中文(简体) ), `return`, (中文(简体) ), `body` |
| `ruleset`, (中文(简体) ), `ruleset-interface` | `PortableRuleset`, (中文(简体) ), `PortableRulesetInterface` | 决定表: `hitPolicy`, (中文(简体) ), `rules`, (中文(简体) ), `default` |
| `loop`, (中文(简体) ), `loop-interface` | `PortableLoop`, (中文(简体) ), `PortableLoopInterface` | 国家机器: `state`, (中文(简体) ), `do`, (中文(简体) ), `output` |
| `optimise`, (中文(简体) ), `optimise-interface` | `PortableOptimise`, (中文(简体) ), `PortableOptimiseInterface` | LP/MILP : (英语) `variables`目标, `constraints` |
| `external-method` | `PortableExternalMethod` | `external func`数字 : `parameters`页:1 `return` |
| `decision`, (中文(简体) ), `decision-interface` | `PortableDecision`, (中文(简体) ), `PortableDecisionInterface` | `decision`数字 : `context`, (中文(简体) ), `body`链接 `requires` |
| `service`, (中文(简体) ), `service-interface` | `PortableService`, (中文(简体) ), `PortableServiceInterface` | `service`数字 : `parameters`, (中文(简体) ), `body`链接 `requires` |
| `error` | `PortableError` | 结构错过主机边界 |

* * *

## 使用量

### 型号建筑

```typescript
import type { PortableContext, PortablePlaceholderValue } from '@edgerules/portable';

const ageInput: PortablePlaceholderValue = {
  '@kind': 'placeholder',
  type: 'number',
  required: true,
};

const model: PortableContext = {
  '@kind': 'context',
  fields: {
    minAge: 18,
    applicant: {
      '@kind': 'context',
      fields: {
        age: ageInput,
        income: { '@kind': 'placeholder', type: 'number', default: 0 },
      },
    },
    isEligible: 'applicant.age >= minAge and applicant.income >= 1000',
  },
};
```

### 定义方法

```typescript
import type { PortableMethod } from '@edgerules/portable';

const isEligible: PortableMethod = {
  '@kind': 'method',
  parameters: { age: 'number', income: 'number' },
  body: {
    '@kind': 'context',
    fields: { result: 'age >= 18 and income >= 1000' },
  },
};
```

### 定义类型

```typescript
import type { PortableType } from '@edgerules/portable';

const CustomerType: PortableType = {
  '@kind': 'type',
  fields: {
    name: { '@kind': 'placeholder', type: 'string', required: true },
    age: 'number',
    tier: { '@kind': 'placeholder', type: 'string', default: 'STANDARD', enum: ['GOLD', 'SILVER', 'STANDARD'] },
  },
};
```

### 要求规则(援引)

```typescript
import type { PortableInvocation } from '@edgerules/portable';

const call: PortableInvocation = {
  '@kind': 'invocation',
  method: 'risk',
  arguments: { age: 'applicant.age', income: 'applicant.income' },
};
```

### 用类过滤器读取

```typescript
import { Kinds } from '@edgerules/portable';

service.get('*', Kinds.METHODS); // methods, rulesets, loops, optimise declarations
service.get('*', Kinds.EXTERNALS); // the resolver-wiring catalog
service.get('*', [...Kinds.EXPRESSION_INTERFACES, ...Kinds.TYPES, ...Kinds.INVOCABLE_INTERFACES]); // project explorer
```

### 处理错误

```typescript
import type { PortableError, PortableErrorType } from '@edgerules/portable';

function handleError(err: unknown): void {
  const error = err as PortableError;
  switch (error.type as PortableErrorType) {
    case 'EntryNotFound':
      console.error('Path not found:', error.path);
      break;
    case 'WrongFilter':
      console.error('Unknown @kind in kinds:', error.message);
      break;
    default:
      console.error(error.message);
  }
}
```

* * *

## 密钥类型

```typescript
// The root model object, a nested record, or a root workbook
PortableContext

// Any node returned by `service.get(path, kinds?)`
PortableNode

// Any value `service.set(path, value)` accepts
PortableSetValue

// A filterable @kind, and the common groups of them
Kind
Kinds

// The base of each method-like interface: { parameters, return? }
MethodDefinition

// A structured error from the engine, and its discriminant
PortableError
PortableErrorType  // "EntryNotFound" | "WrongFieldPath" | "DuplicateName" | "Parse" | "Execution" | "WrongFilter"
```

* * *

## 相关软件包

-   [`@edgerules/node`](https://www.npmjs.com/package/@edgerules/node) ——节点js决策服务
-   [`@edgerules/web`](https://www.npmjs.com/package/@edgerules/web) ——浏览器决定服务

## 常见问题

### @edgerules/portable 是什么？

边缘规则的便携式JSON类型定义\.

### 如何安装 @edgerules/portable？

在项目目录运行 npm install @edgerules/portable，或使用 pnpm add / yarn add / bun add。

### @edgerules/portable 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @edgerules/portable 支持 ESM 还是 CommonJS？

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

### @edgerules/portable 可以商用吗？

@edgerules/portable 使用 未声明 许可。package\.json 没有声明许可证。没有许可证的代码默认保留全部权利，商用前请联系作者或查看仓库中的 LICENSE 文件。以上为概括，不构成法律意见，请以许可原文为准。

### @edgerules/portable 的下载量有多少？

根据 npm 官方下载统计，@edgerules/portable 在 2026/10/13 – 2026/11/11 这 30 天内被下载 2,906 次，日均约 97 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @edgerules/portable 还在维护吗？

最新版本 0\.2\.8-alpha\.202611121551 发布于 2026/11/12（今天）；至今共发布 35 个版本，其中过去 12 个月发布了 35 个；首次发布于 2026/07/04。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

