# 自定义schema类型
> 原文:[Creating a Basic Custom Schema Type](http://mongoosejs.com/docs/customschematypes.html)
> 翻译:小虾米(QQ:509129)
## 创建一个基本的自定义模式类型
在Mongoose 4.4.0的新特性:Mongoose支持自定义类型。在你到达一个自定义的类型之前,然而,知道一个自定义类型是大多数情况下矫枉过正。你可以用最基本的任务采用[自定义的`getters/setters`](http://mongoosejs.com/docs/2.7.x/docs/getters-setters.html),[虚函数](http://mongoosejs.com/docs/guide.html#virtuals),和[单一的嵌入式文档](http://mongoosejs.com/docs/subdocs.html#single-embedded)。
让我们看看一个基本模式类型例子:一个字节的整数。创建一个新的模式类型,你需要继承`mongoose.SchemaType`和添加相应的属性到`mongoose.Schema.Types`。你需要实现一个方法是`cast()`方法。
```
function Int8(key, options) {
mongoose.SchemaType.call(this, key, options, 'Int8');
}
Int8.prototype = Object.create(mongoose.SchemaType.prototype);
// `cast()` takes a parameter that can be anything. You need to
// validate the provided `val` and throw a `CastError` if you
// can't convert it.
Int8.prototype.cast = function(val) {
var _val = Number(val);
if (isNaN(_val)) {
throw new Error('Int8: ' + val + ' is not a number');
}
_val = Math.round(_val);
if (_val < -0x80 || _val > 0x7F) {
throw new Error('Int8: ' + val +
' is outside of the range of valid 8-bit ints');
}
return _val;
};
// Don't forget to add `Int8` to the type registry
mongoose.Schema.Types.Int8 = Int8;
var testSchema = new Schema({ test: Int8 });
var Test = mongoose.model('Test', testSchema);
var t = new Test();
t.test = 'abc';
assert.ok(t.validateSync());
assert.equal(t.validateSync().errors['test'].name, 'CastError');
assert.equal(t.validateSync().errors['test'].message,
'Cast to Int8 failed for value "abc" at path "test"');
assert.equal(t.validateSync().errors['test'].reason.message,
'Int8: abc is not a number');
```