2017-06-11 8 views
-1
let Obj = function Obj<T>(gen: T) { 
    return { 
     data: <{[Key in keyof T]: T[Key]}>{},// need generic, result T[Key] 
     gen, 
    } 
}({ 
    foo(min: number, max: number, container: { data: any }) { 
     let res = ((max - min)/2) 
     container.data.foo = res 
     return res//number 
    } 
}); 
Obj.gen.foo(20,50,Obj) 
let aaaaaaa: number = Obj.data.foo;//Obj.data.foo typeof function. must be number 

Obj.data.fooの型を取得するためのtypescript genericです。しかし数「関数型の型」(数字)

でなければなりませんscreen shotで見てください - 私はT [キー]

の結果のための一般的な必要

を強調しました。

更新:

type qqw<R> =() => R 
    ; 
function ZcddF<Q>(foo: qqw<Q>): Q { 
    return ; 
} 
function foo(): number { return ; } 
let aaaa = ZcddF(foo)// 4a is number 
    ; 
type a = <Z>(foo: qqw<Z>) => Z 
type b =() => number 
    ; 
let ff:a; 
let bbbb = ff(foo)// 4b is number too 
    ; 
// type cccc = a(b) // <------------ QN how get this type/generic 

答えて

0
let fooN =() => 78 
let fooS =() => "" 
let fooArr =(): [string, number] => ["", 78] 

interface iGen<T, R, K extends keyof T> { 
    [key: string]:() => R 
} 

function Obj<T, R, K extends keyof T, S extends {}>(gen: T & iGen<T, R, K>, Ssw?: S) { 
    let res: S & { 
     data: {[K in keyof T]: R} 
     gen: T 
    } = <any>Object.assign(Ssw, { 
     data: {}, 
     gen, 
    }) 
    return res 
} 
let obj = (
    Obj({ fooS }, 
     Obj({ fooN }, 
      Obj({ fooArr }, 
      ))) 
    /*obj*/); 

let gS = obj.gen.fooS   //() => string 
let S = obj.data.fooS   //string 

let gN = obj.gen.fooN   //() => number 
let N = obj.data.fooN   //number 

let gArr = obj.gen.fooArr  //() => [string, number] 
let Arr = obj.data.fooArr  //[string, number] 
let Arr0 = obj.data.fooArr[0] //string 
let Arr1 = obj.data.fooArr[1] //number 

リリースを待つとの提案を見て:typeof演算#66066606#issuecomment-178362393

で任意の式のタイプを取得します。