2016-05-17 28 views
1

我想修改多个具有不同签名的现有函数,但仍保留原始类型/签名检查。在TypeScript中调整函数,并进行类型检查

例如:

const functionOne = (name: string, age: number) => ({ 
    name, 
    age 
}) 

const functionTwo = (name: string, sex: string) => ({ 
    name, 
    sex 
}) 

const addIndexToReturn = (adaptee: any, index: number) => 
    (...args: any[]) => 
    Object.assign(adaptee(...args), { index }) 

const functionWithIndex = addIndexToReturn(functionOne, 22) 

// I don't get any type checking here 
console.log(functionWithIndex('Frank', 32)) 

正如你所看到的,我有很多的返回各种不同的对象的功能。我有一个addIndexToReturn函数来适应这些函数,并返回一个新的函数,该函数将索引添加到它们的返回值中。

但是,新函数没有任何类型检查其参数。

任何想法?

+0

是在'adaptee'不变参数的数量(2)?或至少有限(<3,<4 ...)? – Amit

+0

改编后可以有任何签名 – ColinE

+0

然后我不明白怎么定义 – Amit

回答

1

这似乎使用的伎俩从LINQ工作 -

interface Adapter { 
    <A, T>(adaptee: (a: A) => T): (a: A) => T; 
    <A, B, T>(adaptee: (a: A, b: B) => T): (a: A, b: B) => T; 
} 

const fn = (x: String): String => x + y.toString(); 
const fn2 = (x: String, y: Number): String => x + y.toString(); 

const adapt: Adapter = (adaptee) => adaptee;  

adapt(fn)(1) 
adapt(fn)("") 
adapt(fn2)(1, 2) 
adapt(fn2)("", 2) 
1

基本上你扔掉,因为你的回报拉姆达发生在any[]

你可以尝试像这样的东西来处理这一问题的参数函数类型的信息:这只是

type Indexed<T> = T & { index: number }; 
function addIndexToReturn<T, V>(func: (param: T) => V, index: number) : (param:T) => Indexed<V> { 
    return (x:T) => { 
     let result = func(x) as Indexed<V>; 
     result.index = index; 
     return result; 
    } 
} 

但适用于单参数功能。我不相信你可以正确表达这个函数的任意值,原因类似于my other recent answer

如果我们要处理可变长度参数的情况下,我们必须 治疗参数为集合。因为所有变量必须有 都有一个(尽管可能是参数化的)类型,所以这个 集合对象也是如此。但是,各种功能的类型并不对应 。 (param:A) => B(param:B) => C不同,并且 不能存储在同一个井类型的容器中(禁止联合类型 但这些不会缩放)。

+0

我想这可以用addIndexToReturn重复定义来解决,每个定义都有一个附加参数,类似于C#定义委托类型的方式。 https://msdn.microsoft.com/en-us/library/dd289012(v=vs.110).aspx – ColinE

相关问题