你如何在 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/ 好消息是您实际上可以在打字稿代码部分看到您的代码存在的问题。代码的任何问题都会有红色下划线,将鼠标悬停在它上面可以查看详细信息。
例如,
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/ 好消息是您实际上可以在打字稿代码部分看到您的代码存在的问题。代码的任何问题都会有红色下划线,将鼠标悬停在它上面可以查看详细信息。