Symbol.hasInstance возвращает false для пользовательского объекта - PullRequest
0 голосов
/ 04 апреля 2019

Игровая площадка TypeScript не работает на Symbol.hasInstance встроенном символе, но работает для других.

Пробовал другие методы символов Symbol.match, Symbol.replace работают отлично и Symbol.hasInstance правильно идентифицируется, как показано в console.log

При тестировании на игровой площадке и MDN оба возвращают false с сгенерированным кодом.

Код машинного кода, как на детской площадке, можно вставить ниже в 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 в левой части, когда вы нажимаете run

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 голосов
/ 04 апреля 2019

Официальная игровая площадка не позволяет изменять слишком много опций компилятора. В частности, кажется, что он нацелен на ES5, но Symbol.hasInstance был доступен только в ES2015 и позже. Если вы используете это в качестве цели, он генерирует код, который работает. Попробуйте здесь .

Но как вы можете заставить его генерировать рабочий код даже при использовании 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);
...