2017-07-29 68 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 

希望有幫助。