如何在打字稿中扩展打字?

时间:2017-07-29 21:49:53

标签: typescript

我有一个库,其map函数具有以下定义:

function map<T, U>(f: (x: T) => U, a: Array<T>): Array<U>
function map<T, U>(f: (x: T) => U, a: Functor<T>): Functor<U>

另外,我有另一个Maybe类型的库,它扩展了Functor,因此可以将它与上面的map函数一起使用。

我可以使用下面的定义扩展“library1”map函数,所以当我使用“library1”中的map函数时,它有3个重载(上面2个,下面1个)?

function map<T, U>(f: (x: T) => U, a: Maybe<T>): Maybe<U>

在第一个库中,模块结构如下(库类型通过declaration: true设置自动生成):

// lib/types/index.d.ts
export interface Functor<T> {
    map: <T1>(fn: (a: T) => T1) => Functor<T1>;
}
export interface MapFunction {
    /**
     * Array
     */
    <T, T1>(f: (x: T) => T1, a: Array<T>): Array<T1>;
    /**
     * Functor
     */
    <T, T1>(f: (x: T) => T1, a: Functor<T>): Functor<T1>;
}
export declare const map: MapFunction;

// lib/index.d.ts
export * from "./lib/types"

接下来,在package.json中,我有"typings": "lib/index.d.ts"

1 个答案:

答案 0 :(得分:0)

一种方法是在导入时重命名要扩展的类型:

import { Functor, MapFunction as _MapFunction, map as _map } from './lib'
// guessing at './lib', you might have a different project structure

interface Maybe<T> extends Functor<T> {
  map<T1>(f: (x: T) => T1): Maybe<T1>;
}
interface MapFunction extends _MapFunction {
  <T, T1>(f: (x: T) => T1, a: Maybe<T>): Maybe<T1>;
}
const map: MapFunction = _map; // assuming map is implemented generically

希望有所帮助。