Машинопись: как я могу исключить методы из индекса подписи классов? - PullRequest
0 голосов
/ 16 марта 2020

У меня есть класс, который может быть расширен пользователем следующим образом:

class Foo {
   extendFoo(key: string, value: string) {
      this[key] = value; //<==typescript error: missing index signature
   }
}

, как вы можете видеть, this может быть расширен с помощью строк. проблема в том, что машинопись выдает жалобы, потому что у меня нет подписи индекса, поэтому я попытался добавить одну:

class Foo {
   [key: string]: string;

   extendFoo(key: string, value: string) {  //<==typescript error: extendFoo is not a string
      this[key] = value;
   }
}

как я могу добавить подпись индекса, но при этом разрешить методы в моем классе?

конечно, я могу изменить подпись индекса на [key: string]: string | Function, но это не правильно - любой неизвестный ключ должен быть строкой. Как я могу исключить только extendFoo из подписи индекса?

class Foo {
   [key: string]: string | Function;

   extendFoo(key: string, value: string) {
      this[key] = value;
   }
}

const test = new Foo();
test['some unknown prop'].includes('test'); //<== typescript error: 'Property 'includes' does not exist on type 'Function'

Кстати, я знаю, что расширение this - это плохой шаблон, но я конвертирую устаревший код в машинописный текст и у меня нет выбора .

1 Ответ

0 голосов
/ 16 марта 2020

Я не думаю, что TS может делать именно то, что вы хотите, полностью безопасным для типа способом, поскольку тип ключа должен быть string или number. Поскольку ваши методы известны и исключительны, возможно, будет нормально @ts-ignore ошибка TS?

class Foo {
    [key: string]: string | null;

    // @ts-ignore
   extendFoo(key: string, value: string) {
      this[key] = value;
   }
   // @ts-ignore
}


const test = new Foo();
test['some unknown prop']?.includes('test'); // <- No error
test.extendFoo("asdf", "asdf"); // <- works, too

Я знаю, что это не идеально, но, по крайней мере, вам не придется использовать каждый сайт вызовов.

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