Похоже, что определения DefinitiveTyped для ChanceJS на самом деле не поддерживают то, что вы пытаетесь сделать. Идеальным решением для этого будет изменение этих типов, но если вы не хотите этого делать, утверждения типа будут вашим другом.
У меня не установлен ChanceJS, поэтому вам может потребоваться изменить следующий код (пространства имен и т. Д.), Чтобы он работал:
const chance = new Chance() as Chance.Chance & ITime;
chance.mixin(time as any); // no error
chance.time(); // no error now I hope
В первой строке идея заключается в том, что chance
в итоге превратится в Chance
и ITime
, поскольку именно это делает функция mixin. Это позволит скомпилировать строку chance.time()
без ошибок.
Во второй строке вы просто подавляете ошибку «отсутствует подпись индекса». Есть и другие способы, но суть в том, что, поскольку ITime
является интерфейсом без подписи индекса, вы не можете назначить его интерфейсу с подписью индекса, например MixinDescriptor
. Это известное и в настоящее время предполагаемое поведение. Самый простой способ справиться с этим - изменить ITime
с interface
на type
.
Наконец, ваш миксин может нуждаться в исправлении, поскольку ваша реализация функции time()
ссылается на переменную с именем chance
, которая, кажется, не определена. Я предполагаю, что код выдает ошибку во время выполнения, но, возможно, вы не включили весь соответствующий код, или это просто пример. Принимая код по номинальной стоимости, может быть, вместо chance
вам следует использовать this
(и поддерживать TypeScript счастливым, используя this
параметр с типом Chance
)? Как
function time(this: Chance.Chance) {
const h = this.hour({ twentyfour: true });
const m = this.minute();
return `${h}:${m}`;
};
В любом случае, это самый близкий ответ, который я могу дать, не устанавливая ChanceJS. Надеюсь, это направит вас в правильном направлении. Удачи!