【发布时间】:2019-04-14 20:59:54
【问题描述】:
我有具有属性的对象。这些属性可以是单值的,也可以是列表值的,有些属性是可选的,意味着它们可以是未定义的。下面是一些示例对象:
type A = {
myProp: string;
otherProp?: number;
}
type B = {
coolProp?: boolean[];
someProp: SomeOtherType[];
}
编辑:
现在,我实现了一个函数,它接受这样一个对象和一个属性的名称并按原样返回该属性,但有一个例外:如果该属性不是可选的并且不是一个数组,它会将该属性作为一个将原始类型作为数组类型的数组。
现在,我实现了一个函数,它接受这样一个对象和一个属性的名称,并按原样返回该属性,但有一个例外:如果该属性不是一个数组,它会将该属性作为一个数组返回,并带有原始类型为数组类型。
例如,上面类型 B 的属性不会改变,但类型 A 的 myProp: string; 会变成:myProp: string[];。 otherProp?: number 也将保持不变。
例如,上面类型 B 的属性不会改变,但类型 A 的 myProp: string; 将变为:myProp: string[];。 otherProp?: number 将变为 otherProp?: number[]。
现在我想将此行为放入接口中的返回类型定义中,但我终生无法弄清楚如何使其工作。
我最好的尝试是:
getPropFromObject<O, P extends keyof O>(node: O, propName: P):
any[] extends O[P] ? O[P] : O[P] extends undefined ? O[P] : O[P][]
但是对于像otherProp?: number;这样的单个可选道具它会失败
正确的类型定义应该是什么样子的?
【问题讨论】:
标签: typescript conditional-types