读取泛型类型并在此基础上执行一些逻辑



我正在从环境变量中读取一些数组,其中一些应该是number[],一些应该是string[]…我试图写一个函数,可以处理(也许在未来更多)类型的数组,并将它们转换为适当的值…

我有两个env变量,像这样:

STR_ARR="tst1,tst2,tst3"
NUM_ARR="1,2,3"

下面是函数和一些伪代码:

function parseArray<T>(arrStr: string, minLength: number = 1): T[] {
const arr = arrStr.split(',');
if (arr.length < minLength) {
throw new Error('Array is not of required length');
}
// if (T is number) {
//   ... convert all elements to number and return number[];
// } else if (T is string) {
//   ... check if all string elements are of required length and return string[];
// }
return arr;
}

我想一个解决方案是只是发送数组的类型,我想作为一个函数参数,但这似乎不是很typescript-y,所以我正在寻找一些替代方案。谢谢!

TypeScript在运行时并不存在——它会被编译成JavaScript——所以你不能在函数的逻辑中使用类型参数来返回正确的数组类型。试想一下,如果没有TypeScript,你将如何实现它。函数需要知道你想要返回的类型,所以你必须把它作为参数传递,这是不可避免的,也没有其他选择。

TypeScript允许我们做的是将函数的类型形参明确地绑定到它的返回类型。你暗示你已经有了一个想法如何做到这一点,但这里是我将如何使用函数重载:
type ParseTypes = "string" | "number";
function parseArray(type: "number", arrStr: string, minLength?: number): number[];
function parseArray(type: "string", arrStr: string, minLength?: number): string[];
function parseArray(type: ParseTypes, arrStr: string, minLength: number = 1): unknown[] {
const arr = arrStr.split(',');
if (arr.length < minLength) {
throw new Error('Array is not of required length');
}
// if (type === "number") {
//   ... convert all elements to number and return number[];
// } else if (type === "string") {
//   ... check if all string elements are of required length and return string[];
// }
return arr;
}
const asStr = parseArray("string", "1,2,3"); // string[]
const asNum = parseArray("number", "1,2,3"); // number[]

最新更新