javascript 中的类型

javascript 中的类型

js 是一门弱语言,各式各样的错误多种多样,特别是确定返回值有问题的时候,你会用什么来进行表示错误?

我一般有三个选择:

  1. null
  2. ''
  3. error
  4. {}

第一个选择 null 如果结果是空,倒底是什么意思,是正确还是错误,你在写代码时会很疑惑.
第二个选择 '' 空字符串,结果更糟,因为1. 可能弄混了返回值的类型,2. 想提供一些有用的信息也带不回来。
第三个选择 error ,可以,但是你需要去判断类型
第四个选择 {} 空对象,跟1. 2 没有什么区别

都不是一个很好的选择,因为 js 没有像 c 中的连合类型: union。

随着 es6 的普级,对像的解构语法,给了我很大的启发,用他来进行一个复合类型的表达是可行的。

我的类的设计是如下:

class Result {
    constructor(error,data) {
        this.error = error;
        this.result = data;
    }

    isFaulted() {
        return !!this.error;
    }

    getResult() {
        return this.result;
    }

    getError() {
        return this.error;
    }

    map(fn) {
        if (this.isFaulted()) {
            return Result.ofError(this.getError());
        } else {
            return Result.ofResult(fn && fn(this.getResult()));
        }
    }

    asCallback(cb) {
        return cb && cb(this.getError(), this.getResult());
    }

    asAsync() {
        if (this.isFaulted()) {
            return new Promise.reject(this.getError());
        } else {
            return new Promise.resolve(this.getResult());
        }
    }

    static ofResult (data) {
        return new Result(null, data);
    }

    static ofError(err) {
        return new Result(err, null);
    }

    static of(data, error) {
        return new Result(error, data);
    }
}

设计的特点:

  1. 分成两个部分,一个部分是结果数据,另一个部分是错误,这样就可以分开判断,而不用去判断数据的类型
  2. 结合对像的解构语法,let {result, error} = result ,就能很快知道是否是错误,语意更清晰。
  3. 结合函数式的思想,能进行链式调用如 map。
  4. 也整合了 promise 能进行异步的处理,对 async/await 也很合适

最重要的是减轻思想负担,不用去管返回结果什么情况下是对的,什么情况下的错的,这跟 golang 风格很像。

唯一会有问题的地方就是会传染,多了一些代码的调用, 不过写多了业务代码,我觉得这些都是小问题。

在万不得以的情况下,最外面再使用 try - catch 更好。

原文地址:https://www.cnblogs.com/htoooth/p/8677705.html