Пользовательская функция прототипа объекта [Angular 7.2 - TS 3.2] - PullRequest
0 голосов
/ 14 мая 2019

я пытаюсь создать глобальный прототип с пользовательской функцией.

Мне нужно это:

console.log({'active':1, 'profile':1}._state())

{'active': true, 'profile': 1,'state': 'root'}

Я пробую это:

global.ts

declare global {
    interface Object {
        _state(): Object;
    }
}

Object.prototype._state = function (): Object {
    if (this.active === 1) {
        this.active = true;
    }

    if (this.profile === 1) {
        this.state = 'root';
    }

    return this;
};

export {};

Когда я пытаюсь использовать, произойдет сбой с этой ошибкой:

TS2339: Свойство '_state ()' не существует для типа {'active': 1, 'profile': 1}

И в моем классе говорят, что компонент.ts

import '. /global.ts';

@Injectable()
export class AppState{

    constructor(){
       console.log({'active':1, 'profile':1}._state());
    }
}

TS2345: Аргумент типа 'AppState' нельзя назначить параметру типа 'Object'

1 Ответ

1 голос
/ 14 мая 2019

Поэтому попробуйте изменить код в вашем файле следующим образом:

global.ts

interface Object{
  _state(): Object; 
}

Object.prototype._state = function() {
  if (this.active === 1) {
        this.active = true;
    }
    if (this.profile === 1) {
        this.state = 'root';
    }
    return this;
}

Затем вы должны вставить интерфейс внутри вашего typings.d.ts, чтобы компилятор знал, что в Object произошли изменения.

typings.d.ts

interface Object{
  _state(): Object; 
}

В конце импортируйте ваш глобальный файл внутри вашего модуля.

app.module.ts

// make sure the path is right
import './global.ts';

Это должно сработать. Я попробовал это, и console.log работает как шарм.

...