正在Typescript中将自定义类型与外部库中的类型合并

cqoc49vn  于 2022-12-24  发布在  TypeScript
关注(0)|答案(2)|浏览(147)

我在一个外部库中有一个类型,它看起来像这样:

export declare type CreateProductInput = {
    title: string;
}

我希望此类型具有另一个属性,因此尝试在我自己的index.d.ts文件中添加该属性:
我尝试了以下方法:

export declare type CreateProductInput = {
    subtitle: string;
}

但这并不奏效。我还尝试了以下方法:

declare module '@path/to/library/type/file' {
    declare interface CreateProductInput {
        subtitle: string;
    }
}

但是,这样做会完全覆盖类型,我将无法再访问title字段。
可以像这样合并类型吗?基本上,我想通过添加另一个属性来修改原始类型。

gojuced7

gojuced71#

如果你真的想坚持使用type,那么即使在导入的类型上也应该能够做到这一点:

type a = {
    title: string
}

type b = a & {
    subtitle: string
}

const c: b = {
    title: "title",
    subtitle: "subtitle"
}

console.log(c)

另一种选择是使用接口:

type d = {
    title: string
}

interface e extends d  {
    subtitle: string
}

const f: e = {
    title: "title",
    subtitle: "subtitle"
}

console.log(f)

在操场上检查这两个。你想用你试图这样做的方式覆盖类型是不可能的,也是糟心的形式。创建一个新的类型/接口,有你需要的。

p4rjhz4m

p4rjhz4m2#

不幸的是,类型别名不能被 * merged *。这是与TypeScript中的接口声明的区别之一。
但是你可以创建一个新的接口来 * 扩展 * 一个类型,尽管这看起来并不是你想要的:

type CreateProductInput = {
    title: string;
}

interface CreateProductInput2 extends CreateProductInput  {
    subtitle: string;
}

declare const test: CreateProductInput2;

test.title; // Okay
test.subtitle;

Playground链接
有关更多详细信息,请参见Interfaces vs Types in TypeScript

相关问题