请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

这个cross能写typescript类型吗?

function cross(…args) {
let result = {};
return args.reduce((res, prev) => {
for (let key in prev) {
res[key] = prev[key]
}
return res;
}, result)
}

let crossResult = cross(
{ name: { ownName: ‘wanxiang’ } },
{ link: ‘www.baidu.com’ }
);
这个的方法怎么写typescript类型

正在回答 回答被采纳积分+3

5回答

keviny79 2021-09-04 08:39:36

// 2 精简实现方式2 配合第8章的cross更清晰,利于扩展【要用到第9章技术,暂时了解下】

function merge3<T extends object[]>(...unionObj: [...T]):

  UnionToIntersection<T[number]>

function merge3<T extends object[]>(...unionObj: [...T]) {

  return unionObj.reduce((acc, obj) => cross(acc, obj), {});

}

const cross2 = merge3({ a: 1, c: 3, name: { ownName: "Lewis" } },

  { b: 2 }, { address: "beijing" })

cross2.address //success

cross2.name.ownName //success

export { }


0 回复 有任何疑惑可以回复我~
keviny79 2021-09-04 08:39:05

// 1 精简实现1 配合第8章的cross可读性更好,并利于后期扩展【用到第9章技术,暂时了解下】

import { cross } from './cross'

function merge4<T extends Record<PropertyKey, any>[]>

  (...unionObj: [...T]): UnionToIntersection<T[number]>

function merge4<T extends Record<PropertyKey, any>[]>

  (...unionObj: [...T]) {

  return unionObj.reduce((acc, obj) => cross(acc, obj), {});

}

const cross1 = merge4({ a: 1, c: 3, name: { ownName: "Lewis" } },

  { b: 2 }, { address: "beijing" })

cross1.address //success

cross1.name.ownName //success


0 回复 有任何疑惑可以回复我~
keviny79 2021-09-04 08:38:42

// 此实现用到了第9章infer等技术,考虑到技术同步学习,老师就之前只用了第8章的方式来解答了

// 1. 来理解你说的方案: 理解T[number] 问题就解决了

type T = [{ address: string }, { b: number }]

// S100行 结果

//  {  address: string; } | { b: number; }

type ObjValueType = T[number]  // S100


//  2.再了解UnionToIntersection

type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;

//  2.1

type crossResult1 = UnionToIntersection<T[number]>

type crossResult2 = UnionToIntersection<ObjValueType>

type crossResult3 = UnionToIntersection<{ address: string } | { b: number }>


// 2.2 crossResult3等价于: 【infer 第9章讲到,先了解为占位替换即可】

type crossResult4 = (((k: { address: string }) => void) |

  ((k: { b: number }) => void)) extends (k: infer I) => void ? I : never


// 2.3 分解crossResult4: 等价于下面 testunion        

type test1 = ((k: { address: string }) => void) extends (k: infer I) => void ? I : never

type test2 = ((k: { b: number }) => void) extends (k: infer I) => void ? I : never

type testunion = test1 & test2


0 回复 有任何疑惑可以回复我~
keviny79 2021-09-03 19:43:38

查看 最上方两张截图

交叉任意多个对象,任意多个任意属性 步骤

  1. 编写  function crossAll<T extends object>(...items: Array<T>) {。。。。}

  2. reduce 交叉调用 即可

0 回复 有任何疑惑可以回复我~
  • type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
      k: infer I
    ) => void
      ? I
      : never;
    
    function merge<T extends Record<PropertyKey, unknown>,
      Objs extends T[]
    >(...objs: [...Objs]):UnionToIntersection<Objs[number]>
    function merge<T extends Record<PropertyKey, unknown>,
      Objs extends T[]
    >(...objs: [...Objs]) {
      return objs.reduce((acc, obj) => ({
          ...acc,
          ...obj
      }), {});
    }
    
    const result = merge({ a: 1, c: 3, name: {ownName: "Lewis"} }, { b: 2 })
    result.a // ok
    result.b // ok
    
    老师我昨晚问了别人, 这样可以, 但是不是很能看得懂, 能解释下嘛
    回复 有任何疑惑可以回复我~ 2021-09-03 22:49:39
  • 实现用到了第9章infer等技术,考虑到技术同步学习,老师就之前只用了第8章的方式来解答了,看上方新加的文字 有你要的详细解释
    回复 有任何疑惑可以回复我~ 2021-09-04 08:40:24
  • 提问者 无心殿下 回复 keviny79 #3
    果然,只要是javascript写的代码,都能用typescript类型标注。谢谢老师,非常开心
    回复 有任何疑惑可以回复我~ 2021-09-04 09:18:00
keviny79 2021-09-03 19:41:34


https://img1.sycdn.imooc.com//szimg/613235790859429e09730636.jpg

https://img1.sycdn.imooc.com//szimg/613235610832acad00000000.jpg



参见截图


0 回复 有任何疑惑可以回复我~
  • 提问者 无心殿下 #1
    可能是我的意思没有表达明白,我希望cross函数接受多个对象,对象的属性任意。函数最后返回多个对象合成的一个对象。 我自己也写了类型标注。但是提示时属性是可选的。按道理来说,属性不应该是可选的。谢谢老师的回答
    回复 有任何疑惑可以回复我~ 2021-09-03 19:53:33
  • keviny79 回复 提问者 无心殿下 #2
    查看最上方追加的两张截图 和 修改的文字
    回复 有任何疑惑可以回复我~ 2021-09-03 20:43:17
  • keviny79 回复 提问者 无心殿下 #3
    查看上方追加的文字
    回复 有任何疑惑可以回复我~ 2021-09-04 09:06:20
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信