TypeScript - 使用只有可选字段的返回类型减少 [关闭]
Posted
技术标签:
【中文标题】TypeScript - 使用只有可选字段的返回类型减少 [关闭]【英文标题】:TypeScript - Reduce with a return type that has only optional fields [closed] 【发布时间】:2021-12-22 22:01:22 【问题描述】:我正在努力让 TypeScript 编译器对我的代码感到满意。
我有一个只有可选字段的类型,例如:
interface UserData
email?: string;
phone?: string;
//...
我有 reduce 函数,可以将一些数据格式化为 UserData
格式:
type FieldValue = string | number | boolean;
interface RawData
fieldName: string;
fieldValue: FieldValue;
function formatField(value: FieldValue): string
// format the value and return string
return `formatted-$value`;
function format(rawDataList: RawData[]): UserData
return rawDataList.reduce<UserData>((userData, rawData) =>
// COMPILER ERROR -> Type 'string' is not assignable to type 'undefined'
userData[rawData.fieldName as keyof UserData] = formatField(rawData.fieldValue);
return userData;
,
);
但是,字段分配总是抱怨Type 'string' is not assignable to type 'undefined'
。我错过了什么吗?
【问题讨论】:
I'm not seeing that error,我是否需要更改操场中的任何标志才能得到错误? @Kosmetika 我认为您应该删除as keyof UserData
以获得错误。有点不清楚
对不起,它确实在操场上工作,可能与项目设置有关
【参考方案1】:
rawData.fieldName
是一个字符串,它不能用作UserData
的索引。
因为UserData
只允许您使用email
或phone
。
你可以这样做:
interface UserData
email?: string;
phone?: string;
//...
type FieldValue = string | number | boolean;
interface RawData
fieldName: 'email' | 'phone'; // <--------------------- fix
fieldValue: FieldValue;
function formatField(value: FieldValue): string
// format the value and return string
return `formatted-$value`;
function format(rawDataList: RawData[]): UserData
return rawDataList.reduce<UserData>((userData, rawData) =>
userData[rawData.fieldName] = formatField(rawData.fieldValue);
return userData;
, )
Playground
【讨论】:
我很困惑,OP 的代码有效,不是吗?或者我需要设置一些标志或其他东西以使其不起作用? 嗯,是的,但是 OP 没有说“如果我删除as keyof UserData
”。如果他们能回来澄清问题所在,那就真的了。
不过,如果他们的目标是删除该类型断言(通常是一个有价值的目标),这将向他们展示如何做到这一点,所以... :-)
@captain-yossarian they
是一个中性代词,可以在不知道主语的偏好代词时使用。 wiki
是的。 “他们”作为“性别不确定/不相关”的代词可以追溯到数百年前的英语(牛津英语词典说是 1345 年)。当您不知道时使用“他”仅在 1700 年代末 / 1800 年代初才变得普遍,并且有点排他性。在 1970 年代/80 年代,人们开始宣传“他/她”,但它很笨拙。 :-) 现在,在 2021 年,我们也有非二进制的人使用“他们”而不是“他”或“她”。所以当我不知道的时候,我默认为“他们”。以上是关于TypeScript - 使用只有可选字段的返回类型减少 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
TypeScript核心篇——类(class)-可选参数-存取器-构造函数-静态属性方法-抽象类
将文本字段输入值(如果输入)作为可选参数传递给 react-redux-typescript 应用程序中的 GET api 调用