Как вы определяете массив Partials в TypeScript? - PullRequest
0 голосов
/ 26 августа 2018

Например,

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 во время компиляции.

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 26 августа 2018

Опция A дает вам массив, содержащий Partials:

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

Если это поможет вам понять, подумайте, как бы вы определили массив Partials, если тип не является универсальным. Это было бы Partial[].

Если вы удалите универсальный тип из опции B, вы получите один Partial вместо массива.

Опция C - это кортеж, а не массив.

0 голосов
/ 26 августа 2018

Несмотря на то, что все оказывается одинаковым в соблюденном 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/ Хорошо, что вы действительно можете увидеть проблему с вашим кодом в разделе машинописного кода. Любая проблема с кодом будет выделена красным цветом и наведена на нее, чтобы увидеть детали.

TypeScript Online Play displaying error

0 голосов
/ 26 августа 2018

Правильный путь это

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

Partial<User[]> означает, что он обладает некоторыми из Array свойств .

[Partial<User>] означает, что это массив частичных User с 1 элементом.

Странно, но все они кажутся действительными TypeScript во время компиляции

Синтаксис действителен, а типы - нет. Ожидается, что Partial<User[]> вызовет ошибку , поскольку типы несовместимы.

...