TypeScript游乐场在Symbol.hasInstance
内置符号上失败,但对其他人有效。
尝试其他符号方法Symbol.match
,Symbol.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
答案 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);