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 只允许您使用emailphone

你可以这样做:

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 接口可选属性和返回类型

TypeScript核心篇——类(class)-可选参数-存取器-构造函数-静态属性方法-抽象类

将文本字段输入值(如果输入)作为可选参数传递给 react-redux-typescript 应用程序中的 GET api 调用

Typescript构造函数和继承

TypeScript接口

iOS后台返回某些字段值为null的处理