Как я могу сделать метод расширения для `any` типа в TypeScript? - PullRequest
0 голосов
/ 08 апреля 2020

Я хочу создать метод расширения, чтобы можно было легко распечатать любой машинописный примитив или объект в удобочитаемой форме. Поэтому вместо JSON.stringify(thing) я могу сделать thing.printNice()

Возможно ли это? Я пробовал это, но это не работает:

interface any {
    printNice(): string
}

any.prototype.printNice = function() {
    return JSON.stringify(this)
}

Редактировать: теперь я вижу, что это было задано, и ответ - нет, вы не можете. Есть ли способ сделать sh то, что я пытаюсь сделать? Ввод JSON.stringify(thing) повсюду раздражает.

Ответы [ 3 ]

1 голос
/ 08 апреля 2020

Это возможно - почти все наследуется от Object.prototype, так что вы можете поместить метод на Object.prototype:

Object.prototype.printNice = function() {
  console.log(JSON.stringify(this));
};

(5).printNice();
({ foo: 'bar' }).printNice();

В синтаксисе Typescript:

declare global {
    interface Object {
        printNice: () => void;
    }
}
Object.prototype.printNice = function () {
    console.log(JSON.stringify(this));
};

(5).printNice();
({ foo: 'bar' }).printNice();

Но это, вероятно, не очень хорошая идея, поскольку объекты не ожидают иметь свойство printNice. Отключение встроенных объектов может легко создать проблемы .

Обратите внимание, что объекты, которые не наследуют от Object.prototype, не будут иметь метод в своей цепочке прототипов :

Object.prototype.printNice = function() {
  console.log(JSON.stringify(this));
};

const someObj = Object.create(null);
someObj.foo = 'bar';
// Error, property does not exist:
someObj.printNice();

(но почти все объекты, включая примитивные оболочки, наследуются от Object.prototype)

1 голос
/ 08 апреля 2020

Вместо этого вы можете расширить Object.

Object.prototype.printNice = function() {
    return JSON.stringify(this)
}

А затем:

function myFunc() {
  return 42;
}
console.log(myFunc.printNice());
1 голос
/ 08 апреля 2020

Боюсь, ты не сможешь. any не класс или интерфейс. Это конструкция (тип технически) из-за отсутствия других слов. такой же как var (как тип, а не ключевое слово) или анонимный объект. это то, что вы хотите, чтобы оно было, поэтому оно не может быть расширено

https://www.typescriptlang.org/docs/handbook/basic-types.html#any

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...