你如何在 TypeScript 中定义一个 Partials 数组?

How do you define an array of Partials in TypeScript?

例如,

type User = {
  first_name: string,
  last_name: string,
  notes: string
}

以下哪项可行?

const users:Partial<User>[] = [{first_name: "Name"}]; // A

const users:Partial<User[]> = [{first_name: "Name"}]; // B

const users:[Partial<User>] = [{first_name: "Name"}]; // C

奇怪的是,所有这些在编译时似乎都是有效的 TypeScript。

提前致谢。

正确的方法是

const users:Partial<User>[] = [{first_name: "Name"}];

Partial<User[]>表示它有一些Array properties.

[Partial<User>] 表示它是一个包含 1 个元素的部分 User 的数组。

Weirdly, all of these appear to be valid TypeScript at compile time

语法有效但类型无效。预计 Partial<User[]> causes an error 因为类型不兼容。

选项 A 给你一个包含部分的数组:

const users:Partial<User>[] = [{first_name: "Name"}]; // A

如果它能帮助您理解,请考虑如果类型不是通用的,您将如何定义一个部分数组。那将是 Partial[].

如果您从选项 B 中删除通用类型,您将得到一个 Partial 而不是数组。

选项 C 是元组而不是数组。

尽管所有结果都相似 JavaScript,但三者之间存在巨大差异。

const users:Partial<User>[] = [{first_name: "Name"}];

这是一个有效的部分数组。通过在末尾附加 [],您指定长度是未知的并且可以是任何长度。因此,您可以根据需要在此数组中拥有任意数量的 User 元素。请记住这一点,因为它将有助于下一个示例。

在第二个示例中,您尝试执行相同的操作,但它不同且无效。

const users:Partial<User[]> = [{first_name: "Name"}];

您正在尝试将用户数组变为部分数组。所以, User 还不是部分的,但你正试图将数组变成部分的。你得到一个错误:

Type '{ first_name: string; }[]' is not assignable to type 'Partial<User[]>'.
  Types of property 'pop' are incompatible.
    Type '() => { first_name: string; }' is not assignable to type '() => User'.
      Type '{ first_name: string; }' is not assignable to type 'User'.
        Property 'last_name' is missing in type '{ first_name: string; }'.

在你的第三个例子中:

const users: [Partial<User>] = [{ first_name: "Name" }]; // C

您的操作与您的第一个示例相同,并且有效。但是创建一个Partial数组是有区别的。在这里,这个数组中只能有一个元素。如果您尝试添加另一个元素,则会出现错误,因为 [Partial<User>] 还指定数组的长度恰好为 1。

让我们看看,下面的错误是什么:

const users: [Partial<User>] =    [{ first_name: "Name" }, { first_name: "Name" }];

这里的错误是:

    Type '[{ first_name: string; }, { first_name: string; }]' is not assignable to type '[Partial<User>]'.
  Types of property 'length' are incompatible.
    Type '2' is not assignable to type '1'.

奇怪的是,TypeScript 确实将您的所有示例编译为类似的数组,但它确实会在其在线编译器中给您错误。

有一个TypeScript在线工具可以玩,看你的代码变成JavaScript。 https://www.typescriptlang.org/play/ 好消息是您实际上可以在打字稿代码部分看到您的代码存在的问题。代码的任何问题都会有红色下划线,将鼠标悬停在它上面可以查看详细信息。