我怀疑 TypeScript 是(明智地)遵守 Curly 定律,而 Typescript 是一个转译器,而不是一个对象验证器。也就是说,我还认为 typescript 接口会导致糟糕的对象验证,因为接口的词汇量(非常)有限,并且无法针对其他程序员可能用来区分对象的形状进行验证,例如数组长度、属性数量、图案属性等。
当消耗来自非typescript代码对象,我使用了JSONSchema验证包,如AJV,用于运行时间验证,和一个.d.ts文件发生器(如DTSgenerator或DTSgenerator)从编译打字原稿类型定义我JSONshcema。
主要的警告是,因为 JSONschemata 能够描述无法通过typescript(例如patternProperties)区分的形状,它不是从 JSON 模式到 .t.ds 的一对一转换,您可能需要做一些手工使用此类 JSON 模式时编辑生成的 .d.ts 文件。
也就是说,因为其他程序员可能使用数组长度之类的属性来推断对象类型,所以我习惯于区分可能被 TypeScript 编译器使用枚举混淆的类型,以防止转译器接受使用一种类型来代替其他,像这样:
[MyTypes.yaml]
definitions:
type-A:
type: object
properties:
type:
enum:
- A
foo:
type: array
item: string
maxLength: 2
type-B:
type: object
properties:
type:
enum:
- B
foo:
type: array
item: string
minLength: 3
items: number
它会生成一个.d.ts
像这样的文件:
[MyTypes.d.ts]
interface typeA{
type: "A";
foo: string[];
}
interface typeB{
type: "B";
foo: string[];
}