axetroy/blog

Typescript强类型语言的一些猜想

Opened this issue · 1 comments

从以前旧博客迁移至此
2016-04-07 21:46:42

Typescript是javascript的超集,并且是可以实现强类型的语言。

而且书写方式类似与后台语言,要写接口interface来限定类型。

然后编译成javascript。

javascript是动态类型语言,是弱类型,意味着变量不需要声明类型,不用限制变量的类型,它可以是数字,可以是字符串,可以是对象等等。

好处就是,书写javascript很轻松,坑的地方就是,变量的类型可以改变,可能会引发一些未知的bug。

而在2015年发布了ECMA5,并且以后每年都会发布新版本.

逐渐的模块话,类,以及ECMA7的装饰,正在实现一些javascript预编译的功能,而coffeeScript还没会,就已经被抛弃了。

不禁想,每年一个版本,而且nodejs让javascript可以编写后台,那么以后javascript会不会出现强类型?多线程之类的?

就关于强类型,我处于好奇,写了一段小代码。意在实现javascript的强类型。

代码如下

function proxy(obj) {
  return function(attr, typeLimit) {
    let origin = obj[attr];
    const type = Object.prototype.toString.call(typeLimit);
    Object.defineProperty(obj, attr, {
      set: function(newVal) {
        const newValType = Object.prototype.toString.call(newVal);
        if (type !== newValType) {
          console.error(
            'TypeError:The attr [%s] is only match with %s, not %s',
            attr,
            type,
            newValType
          );
        } else {
          origin = newVal;
          return newVal;
        }
      },
      get: function() {
        return origin;
      }
    });
  };
}

使用方式:

let p = proxy(target);

p('a', 1); // 限制为数字
target.a = 321; // 能正确赋值
console.log(target.a); // 321

target.a = 'hello world'; // TypeError:The attr [a] is only [object Number], not a [object String]
console.log(target.a); // 321

// 限制为字符串
p('b', 'a');

// 限制为数组
p('c', []);

看起来有些繁琐

这个 proxy 函数遇到非 Primitive 的类型就懵逼了