Symbol.hasInstance对自定义对象

时间:2019-04-04 17:19:45

标签: arrays typescript symbols

TypeScript游乐场在Symbol.hasInstance内置符号上失败,但对其他人有效。

尝试其他符号方法Symbol.matchSymbol.replace可以正常工作,并且正确识别了Symbol.hasInstance,如console.log中所示。

在打字机游乐场和MDN上都尝试过使用生成的代码返回false。

TypeScript代码,如在Playground中一样,您可以将以下内容粘贴到 https://www.typescriptlang.org/play/index.html

class Array1 {
    static [Symbol.hasInstance](instance) {
    console.log(instance);
    return Array.isArray(instance);
  }
}
console.log(Symbol.hasInstance.toString());
let arr: string[] = ['a', 'b'];
console.log(arr instanceof Array1);
console.log([] instanceof Array1);
// expected output: true
// output is false

当您单击运行时,生成的代码无法在左侧返回true

var Array1 = /** @class */ (function () {
     function Array1() {
    }
    Array1[Symbol.hasInstance] = function (instance) {
        console.log(instance);
        return Array.isArray(instance);
    };
    return Array1;
}());
console.log(Symbol.hasInstance.toString());
var arr = ['a', 'b'];
console.log(arr instanceof Array1);
console.log([] instanceof Array1);

应返回true而不是false

1 个答案:

答案 0 :(得分:0)

官方游乐场不允许您更改太多的编译器选项。特别是,它似乎以ES5为目标,但是Symbol.hasInstance仅在ES2015及更高版本中可用。如果将其用作目标,它将生成有效的代码。尝试here

但是即使以ES5为目标,又如何获得它来生成有效代码?我不确定为什么要这么做,因为Symbol.hasInstance根本无法在不支持它的引擎中工作,但是这里的TypeScript也会在官方游乐场中生成有效的JavaScript:

class Array1 { }
Object.defineProperty(Array1, Symbol.hasInstance, {
    get: () => (instance) => {
        console.log(instance);
        return Array.isArray(instance);
    }
});
console.log(Symbol.hasInstance.toString());
let arr: string[] = ['a', 'b'];
console.log(arr instanceof Array1);