2.3 模型字段类型

在上一节中,字段的配置是这样的。S则是引入的Sequelize,为了编写方便,重命名了一下。

{
    email: S.STRING,
    name: S.STRING
}

在 define 函数的声明里面,需要传入的字段配置项其实是 DefineAttributes 类型。

[name: string]: string | DataTypeAbstract | DefineAttributeColumnOptions;

定义如上,这表示这对象里面的 key 必须是一个 string,而 value 则是 string 、DataTypeAbstract 、DefineAttributeColumnOptions 三者其一即可。

1.DataTypeAbstract

DataTypeAbstract 只是一个父接口,而 DataTypeString 、DataTypeBigInt 、DataTypeFloat 则都是继承了这个父接口,也就是说我们传入 DataTypeString 类型也是可以的,因为在面向对象的继承中,子类是可以赋值给父类的。

而我们的 DataTypes 的定义是这样的,也就是我们所有支持的类型,但是数据库之间是存在差异的,像 MYSQL 就不支持 JSON 类、Array 类等。

interface DataTypes {
   ABSTRACT: DataTypeAbstract;
   STRING: DataTypeString;
   CHAR: DataTypeChar;
   TEXT: DataTypeText;
   NUMBER: DataTypeNumber;
   INTEGER: DataTypeInteger;
   BIGINT: DataTypeBigInt;
   FLOAT: DataTypeFloat;
   TIME: DataTypeTime;
   DATE: DataTypeDate;
   DATEONLY: DataTypeDateOnly;
   BOOLEAN: DataTypeBoolean;
   NOW: DataTypeNow;
   BLOB: DataTypeBlob;
   DECIMAL: DataTypeDecimal;
   NUMERIC: DataTypeDecimal;
   UUID: DataTypeUUID;
   UUIDV1: DataTypeUUIDv1;
   UUIDV4: DataTypeUUIDv4;
   HSTORE: DataTypeHStore;
   JSON: DataTypeJSONType;
   JSONB: DataTypeJSONB;
   VIRTUAL: DataTypeVirtual;
   ARRAY: DataTypeArray;
   NONE: DataTypeVirtual;
   ENUM: DataTypeEnum;
   RANGE: DataTypeRange;
   REAL: DataTypeReal;
   DOUBLE: DataTypeDouble;
   "DOUBLE PRECISION": DataTypeDouble;
   GEOMETRY: DataTypeGeometry;
}

并且 interface SequelizeStatic extends SequelizeStaticAndInstance, DataTypes,也就是说 SequelizeStatic 是继承了 DataTypes 的,所以我么可以通过 Sequelize.INTEGER来访问 DataTypes 的一些变量。

2.DefineAttributeColumnOptions

首先继承了 ColumnOptions 接口,都是一些可选属性,了解数据库知识的同学,对大部分配置项应该都能猜到是干什么用的。

同时有这个validate这个选项,其实是支持验证的。也就是用了一个validator的库。它所支持的配置项如下。

小荔枝

// status: "inSale" | "noSale"; 注释掉这个的原因是为了避免ts 编译时报错,我们先给它一个 any 类型,来验证一下 validate 方法是否真正的起了验证作用。

main 方法

运行可得到如下结果,说明验证错误是被 catch 捕获到了的,而且也打印了出来。

当把book.validate改成book.save同样也会自动调用验证方法。接下来,把前面的接口改回来,再来试一试正确的。

小提示: 有的时候可能提示并没有告诉你可以调用哪些方法,大多数是因为代码编辑器的问题,直接去查看d.ts,自己找一下即可。

Last updated