Свойство setPrototypeOf не существует для типа ObjectConstructor.

Я хочу реализовать polyfill Object.setPrototypeOf, как описано в:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf

Это мой polyfill.ts:

// Only works in Chrome and FireFox, does not work in IE:
Object.setPrototypeOf = Object.setPrototypeOf || function(obj, proto) {
    obj.__proto__ = proto;
    return obj; 
}

polyfills.d.ts:

declare interface ObjectConstructor{

        setPrototypeOf(obj: any, proto: any);

}

Я пробовал со многими возможностями polyfill.d.ts:

declare global {

    export interface ObjectConstructor {
        setPrototypeOf(obj: any, proto: any);
    }
}

и все же у меня есть следующая ошибка:

[ts] Свойство setPrototypeOf не существует для типа ObjectConstructor. Вы имели в виду 'getPrototypeOf'? lib.es5.d.ts(164, 5): здесь объявляется 'getPrototypeOf'.

Я переношу довольно большое приложение на TypeScript 3.0.3, поэтому мне нужно реализовать полифилл.

Найденное решение:

Достаточно удалить polyfill и:

export class KnownError extends Error {
    public isKnownError: boolean = true;

    constructor(message: string) {
        super(message);
        this.message = message;
        //good enough solution, transpiled to ES5
        (<any>Object).setPrototypeOf(this, KnownError.prototype)
    }
}

Подробнее: Typescript — расширение класса ошибок


person Tomasz Waszczyk    schedule 19.09.2018    source источник
comment
Первое, что вы попробовали для polyfills.d.ts, должно было сработать. Входит ли polyfills.d.ts в ваш файл tsconfig.json? Если вы перейдете к определению на ObjectConstructor, появится ли меню, указывающее, что ваше объявление объединяется с объявлением в стандартной библиотеке?   -  person Matt McCutchen    schedule 20.09.2018
comment
@MattMcCutchen Я думаю, что ваш вопрос имеет решающее значение. Нет. Я не вижу Object.setPrototypeOf. В polyfills.ts я вижу следующую ошибку [ts] Свойство setPrototypeOf не существует для типа ObjectConstructor. Вы имели в виду 'getPrototypeOf'? lib.es5.d.ts(164, 5): здесь объявлен 'getPrototypeOf'. Похоже, что polyfill.ts не работает. Чтобы решить мою проблему, я прочитал typescriptlang.org/docs/handbook/declaration-merging. html   -  person Tomasz Waszczyk    schedule 20.09.2018
comment
Если вы пишете declare var foo: any; в polyfills.d.ts, а затем ссылаетесь на foo из polyfill.ts, разрешается ли ссылка в объявление? Возможно, polyfills.d.ts не включен в ваш проект.   -  person Matt McCutchen    schedule 22.09.2018
comment
Спасибо за публикацию найденного решения. Только было бы лучше поместить это в собственный ответ, потому что люди часто читают только начало вопроса и переходят к ответам.   -  person Pavel_K    schedule 13.10.2018
comment
Я думаю, что решение состоит в том, чтобы ругаться с людьми из ТС, если честно. Решение полифиллов — это костыль — developer.mozilla .org/en-US/docs/Web/JavaScript/Reference/   -  person    schedule 09.12.2018
comment
У меня есть один вопрос, не связанный напрямую с проблемой... почему Object.setPrototypeOf (в polyfill.ts) вызывается без аргументов?... синтаксис такой: Object.setPrototypeOf(obj, прототип)   -  person Dimitris Papageorgiou    schedule 01.07.2021


Ответы (2)


Как я справился с этим (не идеальным) решением:

export class KnownError extends Error {
    public isKnownError: boolean = true;

    constructor(message: string) {
        super(message);
        this.message = message;
        //good enough solution, transpiled to ES5
        (<any>Object).setPrototypeOf(this, KnownError.prototype)
    }
}

person Tomasz Waszczyk    schedule 04.06.2019

Добавьте в tsconfig.json это:

{
  "compilerOptions": {
    "lib": [
      ...
      "es7"
    ]
  }
}
person Nurbol Alpysbayev    schedule 19.09.2018