“传递”泛型类型到另一个泛型类型

问题描述 投票:0回答:1

此后有什么新内容:是否可以将泛型类型作为泛型参数传递?

我的具体问题:

这个工作正常

type isArrStr<T extends readonly string[] > = T extends readonly["str"] ? true :false ; //dummy 
type _retAny<T> = any 

//***************
type wrapper<T>  = any extends _retAny<isArrStr<infer I>>  ? T extends I ? isArrStr<T> : never :never
//********
let myVar:wrapper<readonly["str"]> //ok , return true 
let myVar_1:wrapper<readonly["ll"]> //ok , return false
let myVar_2:wrapper<string> // ok , return never

但这不是

type wrapper<F,T>  = any extends _retAny<F<infer I>>  ? T extends I ? F<T> : never :never //error : Type 'F' is not generic 
//********
let myVar:wrapper<isArrStr,readonly["str"]> //error : Generic type 'isArrStr' requires 1 type argument
//let myVar_1:wrapper<readonly["ll"]>
//let myVar_2:wrapper<isArrStr,string>

您知道克服这个困难的方法吗?感谢您的帮助,祝您有愉快的一天

我正在尝试使用类型重现 HighOrderFunction 行为

typescript typescript-generics typescript2.0
1个回答
0
投票

使用辅助类型正确传递泛型类型:

type isArrStr<T extends readonly string[]> = T extends readonly ["str"] ? true : false;
    type _retAny<T> = any;
    type ExtractGenericParam<F> = F extends (arg: infer U) => any ? U : never;

type wrapper<F, T> = any extends _retAny<F<infer I>> ? T extends I ? F<T> : never : never;
let var: wrapper<isArrStr, readonly ["str"]>; // Returns true
let var_1: wrapper<isArrStr, readonly ["ll"]>; // Returns false
let var_2: wrapper<isArrStr, string>; // Returns never

如果您有任何疑问,请告诉我

© www.soinside.com 2019 - 2024. All rights reserved.