typescript - 如何从 TypeScript 中的泛型部分构建目标对象?

标签 typescript generics partial

我正在使用 typescript@2.3.4。

我有一个目标对象:

interface MyTarget {
    a: string;
    b: string;
    c: string;
    d: string;
}

我想使用泛型创建部分对象的多个转换。

一个这样的转换可能看起来像这样:

const convert = <T extends object>(t: T): MyTarget => {
    return {
        c: "c",
        d: "d",
        ...t,
    };
};

然而这会导致:

error TS2698: Spread types may only be created from object types.

即使我将通用 T 保护为 object

然后我记得有一个 Partial 类型,因此我尝试了这个:

const convert = (partial: Partial<MyTarget>): MyTarget => {
    return {
        c: "c",
        d: "d",
        ...partial,
    };
};

然而 Partial 使所有属性都是可选的。我不想要那个,它现在会抛出:

src/Partial.ts(14,5): error TS2322: Type '{ a?: string; b?: string; c: string; d: string; }' is not assignable to type 'MyTarget'.
  Property 'a' is optional in type '{ a?: string; b?: string; c: string; d: string; }' but required in type 'MyTarget'.

我想创建一个 MyTarget 的实例,每个字段都设置为要求。我确实想保持类型安全,这就是为什么我不想这样做,即使它有效:

const convert = (partial: Partial<MyTarget>): MyTarget => {
    return {
        c: "c",
        d: "d",
        ...partial,
    } as MyTarget; // loses type checks, really don't want to
};

最佳答案

我认为您使用的是旧版本的 TS(在新版本中,传播表达式输入正确)。

无论如何,真正的问题是对象文字可能不是完整的 MyTarget。您的代码将允许此调用

convert({a : "" })// return value is not really MyTarget since it will not contain b

除了 cd 之外,您真正想要的是参数为 MyTarget:

interface MyTarget {
    a: string;
    b: string;
    c: string;
    d: string;
}
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>
const convert = (t: Omit<MyTarget, 'c' | 'd'>) : MyTarget => {
    return {
        c: "c",
        d: "d",
        ...t,
    };
};

关于typescript - 如何从 TypeScript 中的泛型部分构建目标对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54533141/

相关文章:

java - 如何使用 Class 的实例作为泛型类型?

Python获取部分函数的参数

typescript - TypeScript 中的非破坏性类型断言

javascript - 更改 onChangeText 后无法在输入字段中输入

具有多个类类型的单个参数的 Java 泛型通配符

C# - 使用部分类还是单独类?

typescript - 使用 Vue 3 Composition API 创建全局商店

angular - 将数组中的值附加到 BehaviorSubject

java - 我可以使这个 java pluck() 方法更安全吗?