gpt4 book ai didi

TypeScript:返回扩展 Record 的通用类型的函数

转载 作者:行者123 更新时间:2023-12-05 03:53:26 25 4
gpt4 key购买 nike

我想创建一个 parse<Type>() 函数来解析字符串并返回一个对象,但我希望 parse() 返回正确的类型,我很挣扎。

type Identity = {
name: string;
};

type ContactDetails = {
phone: string;
email: string;
};

function parse<T extends Record<string, string>>(input: string): T {
const result = {};
input.split('&').forEach(bits => {
const [name, value] = bits.split('=');
result[name] = value;
});
return result;
}

parse<Identity>('name=Paulin');
parse<ContactDetails>('phone=0123456789&email=paulin@email.com');

我收到 TypeScript 错误:

Type '{}' is not assignable to type 'T'. '{}' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'Record'.ts(2322)

我明白问题出在哪里:{} 与通用 Record 类型不兼容。但是我该如何解决呢?

非常感谢!

最佳答案

我相当确定这是您必须求助于类型断言的地方之一。在这种情况下:

function parse<T extends Record<string, string>>(input: string): T {
const result: Record<string, string> = {};
// −−−−−−−−−−−^^^^^^^^^^^^^^^^^^^^^^^^
input.split('&').forEach(bits => {
const [name, value] = bits.split('=');
result[name] = value;
});
return result as T;
// −−−−−−−−−−−−^^^^^
}

On the playground

不过,了解这里的限制很重要。如果你的IdentityContactDetails类型有特定的实现(它们在你的例子中没有,它们只是 interface s),对象 parse该实现不会支持返回。它只是一个Record<string, string> .所以你最好拥有 parse返回 Record<string, string>取而代之的是,让调用者对类型做出明智的决定。

关于TypeScript:返回扩展 Record<string, string> 的通用类型的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61614062/

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