Flutter如何将类型作为参数传入以实现类型转换?
可行的实现方案
首先得明确:在TypeScript里,类型是编译时概念,不能直接把类型当作值参数传入函数。你代码里的as type是编译时的类型断言,而type作为函数参数是运行时的值,两者不在同一层面,直接这么写会报错。下面是两种能达成你需求的实现方式:
1. 泛型实现编译时类型断言
如果只需要编译时的类型转换(也就是让TypeScript识别转换后的类型),不需要运行时做实际的类型校验或转换,用泛型就可以:
function casting<T>(a: any[], callback: (item: any) => unknown): T[] { return a.map(item => callback(item) as T); } // 使用示例 const rawData = [10, 20, 30]; const stringData = casting<string>(rawData, num => num.toString()); // stringData 会被TS识别为 string[] 类型
这里的<T>是泛型类型参数,调用函数时指定目标类型,编译时as T就能完成类型断言,让TS正确推导返回值的类型。
2. 传入构造函数实现运行时类型转换
如果需要在运行时真正把值转换成目标类型(比如字符串转数字、或者实例化自定义类),就得传入类型对应的构造函数作为参数,同时结合泛型保证类型安全:
function casting<T>( a: any[], callback: (item: any) => unknown, typeCtor: new (...args: any[]) => T | typeof Number | typeof String | typeof Boolean ): T[] { return a.map(item => { const processed = callback(item); // 处理基础类型转换 if (typeCtor === Number) return Number(processed) as T; if (typeCtor === String) return String(processed) as T; if (typeCtor === Boolean) return Boolean(processed) as T; // 处理自定义类的实例化 return new typeCtor(processed) as T; }); } // 基础类型使用示例 const numData = casting(rawData, str => str, Number); // numData 类型为 number[] // 自定义类示例 class Product { id: string; constructor(id: string) { this.id = id; } } const products = casting(rawData, num => `prod-${num}`, Product); // products 类型为 Product[]
这种方式既保证了编译时的类型提示,又能在运行时完成实际的类型转换。
关键提醒
- 若仅需编译时的类型标注,泛型完全足够,不需要额外传类型相关的参数;
- 若需要运行时的类型转换逻辑,必须传入构造函数(因为类型在编译后会被擦除,运行时不存在“类型”这个实体)。
内容的提问来源于stack exchange,提问作者deraemon
相关产品推荐
相关产品推荐

