我正在制作一个ChanceJS mixin,我打算通过npm分发。
我在尝试定义正确的接口和键入时遇到问题。
package的示例:// index.ts
import * as Chance from 'chance';
export interface ITime {
time(): string;
}
function time() {
const h = chance.hour({ twentyfour: true });
const m = chance.minute();
return `${h}:${m}`;
};
export const time: ITime = {
time,
};
某人如何使用它的示例:
import * as Chance from 'chance';
import { time } from 'chance-time';
const chance = new Chance();
chance.mixin(time);
chance.time()
我得到的错误是:
Error:(12, 14) TS2345: Argument of type 'ITime' is not assignable to parameter of type 'MixinDescriptor'.
Index signature is missing in type 'ITime'.
Error:(25, 26) TS2339: Property 'time' does not exist on type 'Chance'.
答案 0 :(得分:0)
看起来DefinitelyTyped definitions for 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
。这是known and currently intended行为。处理问题的最简单方法可能是将ITime
从interface
更改为type
。
最后,你的mixin可能需要fixin',因为你的time()
函数实现引用了一个名为chance
的变量,似乎没有被定义。我想这段代码会在运行时抛出一个错误,但也许您还没有包含所有相关代码,或者它只是一个例子。使用面值代码,也许代替chance
,您应该使用this
(并使用类型为Chance
的{{3}}来保持TypeScript的满意度?像
function time(this: Chance.Chance) {
const h = this.hour({ twentyfour: true });
const m = this.minute();
return `${h}:${m}`;
};
无论如何,在没有安装ChanceJS的情况下,这是我能给出答案的最接近的答案。希望它能让你指出正确的方向。祝你好运!
答案 1 :(得分:0)
@jcalz答案已经死了并解决了这个问题。
const chance = new Chance() as Chance.Chance & ITime;
chance.mixin(time as any); // no error
chance.time(); // no error
答案 2 :(得分:0)
该库现在有默认类型:npm i change @types/chance
import * as Chance from 'chance';
const digit: number = Chance.default().integer({ min: 0, max: 20});