面试题:请问typescript如何做到对象合并的类型推导?

发布于 2022-09-13 00:47:43 字数 533 浏览 14 评论 0

实现两个对象部分属性的合并,比如说t,s两个对象,当s中有t不存在的属性时给t加上s的属性并赋值。要求不更改t的引用地址。方法如下

const merge = (target, source)=> {
for (const key in source) {
        if (typeof target[key] === 'undefined') {
            target[key] = source[key];
        }
    }
    return target;
}

补充1个测试案例

const a = { name: undefined, age: 2 };
const b = { name: '小明', weigth: 100 };
const c = merge(a,b)
console.log(a)  // { name: '小明', age: 2,weigth: 100 }
console.log(c)  // { name: '小明', age: 2,weigth: 100 }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

小霸王臭丫头 2022-09-20 00:47:43
import typePredicates from 'ts-type-predicates';

const merge = (target, source) =>
{
    for (const key in source)
    {
        if (target[key] === 'undefined')
        {
            target[key] = source[key];
        }
    }
    return target;
}

const a = {
    name: '小明',
    age: 18,
}
const b = {
    age: '18',
    weight: 100,
}

typePredicates<typeof a & Omit<typeof b, keyof typeof a>>(a, () => merge(a, b))

console.log(a.weight)

红衣飘飘貌似仙 2022-09-20 00:47:43

类型上的合并只需要使用 & 即可

function merge<T, R>(a: T, b: R): T & R {
    return 0 as unknown as any
}

const c = merge({ a: 1 }, { b: 1 })

c.a + c.b

还有一种方法可以兼具类型与效果

const d = { ...{ a: 1 }, ...{ b: 1 } }

ts play

香草可樂 2022-09-20 00:47:43
type A = {
  a: number;
  b: string;
}
type B = {
  a: string;
  c: boolean;
}

type E<A, B> =  A & Omit<B, keyof A>;
type S = E<A, B>;

const m: S = {
  a: 1,
  b: '',
  c: false
}

这样?

窗影残 2022-09-20 00:47:43

不就是A&B的事情嘛,有那么复杂吗

type MergeObject = {
    [key in string | number]: any
}

// 只是写法这样看着顺眼
type Target<A, B> = A & Omit<Partial<B>, keyof A>

// type Merge<A, B> = {
//     [P in keyof A]: A[P]
// } & {
//     [P in keyof B]: B[P]
// }
type Merge<A, B> = A & B

function merge<A extends MergeObject, B extends MergeObject>(target: A, source: B): Merge<A, B> {
    for (const key in source) {
        if (typeof target[key] === 'undefined') {
            (target[key] as Target<A, B>) = source[key]
        }
    }
    return target as Merge<A, B>
}

const a = {
    name: '小明',
    age: 18
}
const b = {
    weight: 100
}
const person = merge(a, b)
console.log(a == person, person)

const abc = {
    history: {
        finish: false
    }
}
const t = {
    history: {}
}
const mergeABC = merge(abc, t)
console.log(abc == mergeABC, mergeABC)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文