Несмотря на то, что все оказывается одинаковым в соблюденном JavaScript, во всех трех есть огромная разница.
const users:Partial<User>[] = [{first_name: "Name"}];
Это допустимый массив Partial. Добавляя [] в конце, вы указываете, что длина неизвестна и может быть любой. Таким образом, вы можете иметь столько элементов User в этом массиве, сколько захотите. Запомните это, так как это поможет в следующем примере.
Во втором примере вы пытаетесь сделать то же самое, но оно отличается и недействительно.
const users:Partial<User[]> = [{first_name: "Name"}];
Вы пытаетесь превратить массив User в Partial. Таким образом, пользователь еще не является частичным, но вы пытаетесь превратить массив в частичный. Вы получаете ошибку:
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<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/ Хорошо, что вы действительно можете увидеть проблему с вашим кодом в разделе машинописного кода. Любая проблема с кодом будет выделена красным цветом и наведена на нее, чтобы увидеть детали.