AutoComplete组件属性检查问题

来源:9-4 新的挑战 - AutoComplete组件分析

qq_慕仙7238509

2020-04-21

  interface SelectData {
	  value: string;
  }
  type SelectDataType<T = {}> = T & SelectData;
  data: () => SelectDataType[] | Promise<SelectDataType[]>;
  上面代码为AutoComplete组件里面对属性data的定义
  <AutoComplete
        data={()=>[
          { label: "a", value: "a" },
          { label: "b", value: "b" },
          { label: "c", value: "c" },
        ]}
        renderOption={(item) => {
          return item + "  hahah";
        }}
      />
  

为什么当我把data去掉函数直接写成数组 AutoComplete组件里面data填数组label属性会检测出错?(不能将类型“{ label: string; value: string; }”分配给类型“SelectData”。对象文字可以只指定已知属性,并且“label”不在类型“SelectData”中)
难道是写成函数形式会让ts规避一些检查吗?

data:  SelectDataType[] | Promise<SelectDataType[]>;
写回答

2回答

张轩

2020-04-24

同学你好 你的这个问题可以简化成我写的这个问题

//img.mukewang.com/szimg/5ea24d5409116f9e23361574.jpg

因为对这个类型兼容性的检查方式跟 interface 一样的,只要在字段上满足类型的要求就好了,多出来内容没关系,有一些特殊的场景下,多出来内容会报错,场景文档在这里 https://www.typescriptlang.org/docs/handbook/interfaces.html#excess-property-checks

在这种情况下,ts 认为大概率是我们犯错了,这个 object 是在那里现成声明的,只能给那个地方用,声明额外字段是不合理的


1
1
qq_慕仙7238509
非常感谢!
2020-04-24
共1条回复

张轩

2020-04-22

同学 请提供一下你出错的代码吧 我在本地没有复现这个问题 谢谢

0
1
qq_慕仙7238509
函数形式 组件定义页 interface SelectData { value: string; } type SelectDataType = T & SelectData; interface AutoCompleteProps extends Omit { data: () => SelectDataType[] | Promise; onSelect?: (item: SelectDataType, index: number) => void; renderOption?: (item: string) => React.ReactNode; } 使用页 [ { label: "a", value: "a" }, { label: "aa", value: "aa" }, { label: "biao", value: "biao" }, ]} renderOption={(item) => { return item + " hahah"; }} /> 数组形式 interface SelectData { value: string; } type SelectDataType = T & SelectData; interface AutoCompleteProps extends Omit { data: SelectDataType[] | Promise; onSelect?: (item: SelectDataType, index: number) => void; renderOption?: (item: string) => React.ReactNode; } 使用页 { return item + " hahah"; }} />
2020-04-22
共1条回复

React18+TS高仿AntD从零到一打造组件库

设计,开发,测试,发布再到 CI/CD,从0到1造轮子

2123 学习 · 959 问题

查看课程