2017-07-29 82 views
1

我有一个图书馆,里面有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函数的定义如下,所以当我使用map函数从“library1”它有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"

+0

1.你的问题与'typings'无关,请阅读它的含义,2.实现是否支持这种签名? –

+0

@NitzanTomer关于2,因为我正确理解这个问题,是的,实现支持这个签名 – 1ven

+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 

希望有帮助。