Typescript-如何基于接口将对象的属性子集转换为变量

问题描述 投票:1回答:1

我有一个接收两种类型的并集的函数:

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 }" 
}
reactjs typescript
1个回答
0
投票

您正在使用一个在一组已知的属性名称上进行迭代的函数-在纯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;
}
© www.soinside.com 2019 - 2024. All rights reserved.