在打字稿中将嵌套对象叶键值声明为未定义

Declare nested object leaf key values as undefined in typescript

考虑如下嵌套对象

class Person {
    name: string = 'name';
    address: {street: string, pincode: string} = {street: 'street', pincode: '44555'};
}

有一个效用函数(undefinedAllLeadNodes)取消定义所有叶节点。所以传递一个新的 Person() 在下面创建

person.name = undefined
person.address.street = undefined;
person.address.pincode = undefined;

如果我声明如下

export function undefineAllLeafProperties<
    T extends object
>(obj : T) :  {[key: string] : any} {
    ...undefine all leaf nodes here
}

显示 person.address.street 的编译错误,{[key: string] : any} return 类型声明听起来不错。

但是实用函数的正确 return 类型是什么 (undefinedAllLeadNodes) 这样我就可以像下面一样访问它而不会出现任何错误

person.address.street = 'update only street';

您可以这样定义这样的类型:

type Undefine<T extends object> = {
  [K in keyof T]: T[K] extends object ? Undefine<T[K]> : T[K] | undefined
}

playground link

这里我们再次使用 mapped types to iterate over all keys (using keyof operator) of the provided T object and conditional type to check whether the value of T[K] (using lookup type) 是一个对象。当它是时,我们递归地迭代 T[K] 键。否则(当 T[K] 不是一个对象时)我们只是改变它的类型以允许 undefined 值沿着 T[K].

的主要类型

请记住,在 undefineAllLeafProperties 函数代码中,您可能必须键入 assert return values 。因为打字稿通常 cannot infer the exact shape of the conditional type 当它依赖于未指定的泛型类型参数时。