在构建面向摩尔多瓦市场的Web应用时,IWAC框架要求严格遵循本地网络无障碍指南,其中对非文本内容(如图像、音频、视频、图表等)的类型标注有清晰规范。使用TypeScript可以在编译期将这些规范固化为类型系统的一部分,使团队成员在编码时就避免错填、漏填无障碍语义字段。本文围绕如何为IWAC封装一套非文本内容类型定义展开,从底层类型设计到工程落地细节进行逐步说明。

非文本内容类型的领域模型与TypeScript映射
摩尔多瓦网络无障碍指南把非文本内容拆分为多个语义类别,例如装饰性图像、信息性图像、预录音频、实时视频、数据图表等。若用普通字符串去记录这些类别,后端或前端都可能在传值时写出拼写错误的单词,而运行时才会暴露问题。TypeScript的字符串字面量联合类型正好能把有限集合固定在类型层。
我们可以先定义基础类别,再用判别属性组合出更复杂的对象类型。下面代码展示了如何用类型别名描述指南中的核心非文本类别,以及对应的元信息结构。注意这里的kind字段就是判别联合的标签,编辑器会据此做自动提示和窄化。
// 摩尔多瓦无障碍指南非文本基础类别
type NonTextKind =
| 'decorative-image'
| 'informative-image'
| 'prerecorded-audio'
| 'live-video'
| 'data-chart';
interface NonTextBase {
kind: NonTextKind;
alt: string;
lang: string;
}
interface DecorativeImage extends NonTextBase {
kind: 'decorative-image';
alt: '';
}
interface InformativeImage extends NonTextBase {
kind: 'informative-image';
longDescription?: string;
}
type NonTextContent = DecorativeImage | InformativeImage;
上述结构把指南里的“装饰性图像无需替代文本”这一规则直接编码进类型:DecorativeImage的alt被限制为空字符串,而信息性图像则允许选填长描述。这样在IWAC上报资源时,类型检查器会拒绝不符合规范的赋值。
为IWAC封装可复用的类型声明模块
在真实项目中,IWAC通常以SDK或REST接口形式存在。我们需要把前面领域模型包装成独立声明文件,方便在多端复用。推荐建立iwac-a11y.d.ts,通过declare module语法扩展IWAC原有模块,而不修改其源码。
下面的示例演示了如何向IWAC的资源配置函数注入非文本类型约束。我们利用泛型让registerAsset只接受合法的NonTextContent子类型,从而在调用处获得精确报错。
declare module 'iwac-sdk' {
import { NonTextContent } from './non-text-types';
export function registerAsset<T extends NonTextContent>(asset: T): void;
}
// 使用侧
import { registerAsset } from 'iwac-sdk';
registerAsset({
kind: 'informative-image',
alt: '车站平面图',
lang: 'ro',
longDescription: '显示无障碍电梯位置'
});
// 以下代码会在编译期报错:alt不能为空
registerAsset({
kind: 'decorative-image',
alt: '随便写',
lang: 'ro'
});
这种封装方式不改变IWAC运行逻辑,只增强开发体验。当指南更新新增了“触觉图形”类别,只需在NonTextKind中加入字面量并补充接口,所有调用点会立即收到类型层面的同步提醒,比人工核对文档更可靠。
另外,如果团队使用ESLint配合@typescript-eslint,还能通过规则禁止任何把kind设为任意string的兜底写法,彻底堵住类型逃逸漏洞。这也是摩尔多瓦项目合规审计中常被要求的一项静态保障。
判别联合与运行时校验的衔接策略
TypeScript类型在编译后会被擦除,因此IWAC收到的数据仍需在运行时验证。我们可以基于前面定义的判别联合写出类型守卫,既服务运行时,也帮编译器做窄化。这样封装后的模块同时具备静态与动态双重保险。
以下代码给出isNonTextContent守卫函数,它检查kind与必填字段,返回布尔值并携带类型谓词。在IWAC提交前调用它,可拦截被
function isNonTextContent(value: unknown): value is NonTextContent {
if (typeof value !== 'object' || value === null) return false;
const v = value as Record<string, unknown>;
const allowed = ['decorative-image','informative-image','prerecorded-audio','live-video','data-chart'];
if (typeof v.kind !== 'string' || !allowed.includes(v.kind)) return false;
if (typeof v.alt !== 'string' || typeof v.lang !== 'string') return false;
if (v.kind === 'decorative-image' && v.alt !== '') return false;
return true;
}
const payload: unknown = JSON.parse(receivedJson);
if (isNonTextContent(payload)) {
registerAsset(payload);
} else {
throw new Error('非文本内容不符合摩尔多瓦指南类型定义');
}
将类型守卫与IWAC封装层结合,可以形成“编辑期类型约束、提交前运行校验”的闭环。对于需要对接第三方无障碍扫描服务的团队,这套定义还能直接生成JSON Schema,减少手工维护两份规则的成本。从架构看,它把法律级的无障碍要求转成了工程师日常最熟悉的接口提示,落地阻力明显更小。
TypeScriptIWAC非文本内容类型修改时间:2026-08-16 11:38:26