在TypeScript中构建Chance Mixin

时间:2018-05-07 19:20:23

标签: typescript typescript-typings definitelytyped

我正在制作一个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'.

3 个答案:

答案 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最终会成为ChanceITime,因为这就是mixin函数的作用。这将允许chance.time()行无错误地编译。

在第二行中,您只是禁止"索引签名丢失"错误。还有其他方法,但它的要点是,由于ITime是没有索引签名的接口,因此您无法将其分配给具有索引签名的接口,如MixinDescriptor。这是known and currently intended行为。处理问题的最简单方法可能是将ITimeinterface更改为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});