gpt4 book ai didi

typescript - 将类型名称转换为实际类型

转载 作者:行者123 更新时间:2023-12-02 03:04:29 31 4
gpt4 key购买 nike

假设我们有以下枚举

enum PrimayValType {
"string",
"boolean",
"integer",
"float"
}

现在我想编写一个函数,输入一个 Buffer 和一个 PrimaryValType 类型的参数,并根据 PrimaryValType 转换缓冲区。如何在 Typescript 中编写这样的函数?

function f(b: Buffer, t: PrimayValType): ??? {
// converts b to a literal based on t
}

const b = Buffer.from('test', 'utf-8');
f(b, PrimayValType.string) // should be of type string

最佳答案

您可以将函数的返回类型编写为映射类型。首先,将 PrimaryValType 定义为从字符串文字到实际类型的映射:

type PrimaryValType = {
"string": string,
"boolean": boolean,
"integer": number,
"float": number,
}

然后给定一个 K extends keyof PrimaryValType 类型的字符串,我们可以使用映射类型 PrimaryValType[K] 将其映射到正确的返回类型。

要将输入解析为正确的类型,您可以打开类型字符串:

function parse<K extends keyof PrimaryValType>(s: string, t: K): PrimaryValType[K] {
switch (t) {
case "integer": return parseInt(s) as PrimaryValType[K];
case "float": return parseFloat(s) as PrimaryValType[K];
case "boolean": return (s === "true") as PrimaryValType[K];
case "string": s as PrimaryValType[K];

default: throw new Error("Illegal t: " + t);
}
}

需要类型断言,因为 Typescript 无法判断当 t === 'integer' 时,K 不能是 'string'<例如,。可以通过将解析器函数存储在对象中来简化代码,如 @kmos.w 的答案:

const parsers: { [K in keyof PrimaryValType]: (s: string) => PrimaryValType[K] } = {
"integer": parseInt,
"float": parseFloat,
"boolean": s => s === "true",
"string": s => s,
};

function parse<K extends keyof PrimaryValType>(s: string, t: K): PrimaryValType[K] {
return parsers[t](s) as PrimaryValType[K];
}

出于同样的原因,仍然需要类型断言。

Playground Link

关于typescript - 将类型名称转换为实际类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59321296/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com