在打字稿中将嵌套对象叶键值声明为未定义
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
}
这里我们再次使用 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 当它依赖于未指定的泛型类型参数时。
考虑如下嵌套对象
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
}
这里我们再次使用 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 当它依赖于未指定的泛型类型参数时。