我有一个接收两种类型的并集的函数:
interface A {
propA: string;
}
interface B {
propB: number;
propC: boolean;
}
function C(props: A & B) {
}
现在,在函数体内,我想从每个接口中获取仅包含属性子集的对象;所以我想知道Typescript是否有任何实用工具可以实现这一目标:
function C(props: A & B) {
const a = fancyPicker<A>(props);
const b = fancyPicker<B>(props);
console.log(a);
// prints "{ propA: "some string" }"
console.log(b);
// prints "{ propB: 42, propC: false }"
}
您正在使用一个在一组已知的属性名称上进行迭代的函数-在纯TypeScript中无法完成此操作,因为TypeScript使用类型擦除,因此运行时脚本不知道该属性名称是什么。
但是使用TypeScript编译时扩展称为Custom Transformer,specifically ts-transformer-keys
TypeScript编译器将发出可以使用的属性名称列表。
这是可行的方法,但并不完美,因为它不使用每个属性的类型-它仅与名称匹配:
ts-transformer-keys
用法(使用您的示例):
import { keys } from 'ts-transformer-keys';
type IndexableObject = {
[key: string]: any
};
function fancyPicker<TSubset extends object>(superset: IndexableObject): Partial<TSubset> {
const subsetPropertyNames = keys<TSubset>();
const ret: Partial<TSubset> = {
};
for (const subsetPropertyName of subsetPropertyNames) {
const propName: string = subsetPropertyName as string;
if (propName in superset) {
const value = superset[propName];
ret[subsetPropertyName] = value;
}
}
return ret;
}