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

实现两个对象部分属性的合并,比如说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 }


回答:

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)

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


回答:

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

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


回答:

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

}

这样?


回答:

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

typescript">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)

以上是 面试题:请问typescript如何做到对象合并的类型推导? 的全部内容, 来源链接: utcz.com/p/935804.html

回到顶部