В чем разница между любым и любым []?

В чем разница между любым и любым []?


Пример 1 (работает как ожидалось)

name1: any;
name2: any[];
this.name1 = this.name2;

Пример 2 (Это также работает как ожидалось)

name1: any;
name2: any[];
this.name2 = this.name1;

Почему typescript доступ к типу данных any может быть доступен для типа данных any[]. Так же, как и тип данных any[], можно получить доступ к типу данных any? и Какой из них лучше всего использовать? И Если тип данных - это просто объект (а не массив), например string or number or object or any, то почему any[ ] будет принимать этот тип объекта без отображения любая ошибка времени выполнения или времени компиляции?.


Ответ 1

Если мы посмотрим на этот TypeScript код:

let name1: any = "John";
let name2: any[] = ["Mary", "Sue", "Sally"];
name1 = name2;

let name3: any[] = ["Luke", "Paul", "Ringo"];
let name4: any = "Mark";
name3 = name4;

Javascript, который он компилирует, это:

var name1 = "John";
var name2 = ["Mary", "Sue", "Sally"];
name1 = name2;
var name3 = ["Luke", "Paul", "Ringo"];
var name4 = "Mark";
name3 = name4;

Переменные JavaScript являются динамическими и не имеют заданного типа. Я могу представить, что это может быть сообщено как предупреждение или ошибка компилятором TypeScript, но это не останавливает генерацию JavaScript или предотвращает запуск JavaScript.

Таким образом, пока нет текущих компиляционных ошибок или предупреждений для назначений any/any[], any[] все еще может использоваться для информирования разработчика о ожиданиях.

Примечание.. Это не код, который я когда-либо писал бы или предлагал, чтобы он когда-либо использовался. Это всего лишь код OPs со значениями и показывает, каким будет результирующий JavaScript, и что, поскольку он компилируется на JavaScript, не может быть ошибок во время выполнения из-за типа, поскольку переменные имеют динамический тип. Это одна из причин, по которым мы решили использовать TypeScript: проверка статического типа времени компиляции. По этой причине обычно можно избегать any и any[] в пользу класса или интерфейса, которые лучше представляют данные. И в этом случае string vs. string[] (или любой другой тип) покажет ошибку компилятора.

В этом примере обе name1 = name2 и name3 = name4 являются ошибками времени компиляции, так как переменные выводят тип из назначения, а их использование проверяется типом в следующем коде.

let name1 = "John";
let name2 = ["Mary", "Sue", "Sally"];
name1 = name2; //Type 'string[]' is not assignable to type 'string'.

let name3 = ["Luke", "Paul", "Ringo"];
let name4 = "Mark";
name3 = name4; //Type 'string' is not assignable to type 'string[]'.

Ответ 2

Если вы используете any, как слева, так и справа от задания, вы в основном говорите, что Typescript не использует проверку типов.

В any находится с левой стороны, это означает, что переменная, которую вы хотите назначить, может принимать любой тип, и поэтому она принимает что-либо, включая объект типа any[].

Если тип any находится с правой стороны, а у вас есть myVar: any[] с левой стороны, вы в основном говорите, что Typescript не использует проверку типов. Учитывая, что проверка типа не применяется во время выполнения, вы получите myVar, заполненную тем, что вы можете иметь в правой части задания.

Ответ 3

Разница между любым и любым [] находится в Intellisence.

var a:any = .....

a.map , a.join (no intellisense, typescript does not know if a is an array or not)


var a:any[] = ....
a.map , a.join (typescript knows that a is an array and will provide intellisence)

Ошибки времени компиляции

var aa:any[] = "a"; // error typescript will not allow this

var a:any = "a"; // a can be string, there is no harm

aa = a; // typescript cannot detect error at 
        // compile time because a can be array

var someString:string;

aa = someString; // typescript knows that aa is an array and someString is not

Объявив что-то any[], вы говорите, что я хочу, чтобы этот объект имел тип массива. Тем не менее, любой буквально есть что угодно, даже массив может быть any, поэтому typescript позволяет назначать любой для любого массива.

TypeScript будет обнаруживать ошибки времени компиляции всякий раз, когда это возможно, но когда вы что-то устанавливаете, он не будет обнаруживать ошибки времени компиляции.

До компилятор-конструктор должен выполнить такую ​​ошибку времени компиляции или нет, я думаю, что следующее не должно быть разрешено,

 a:any 
 aa:any[] = a; // this should be compile time error

Чтобы избежать этого, можно, конечно, указать его как aa = a as any[], так же, как в таких языках, как С# и Java.

Ошибка выполнения

JavaScript не имеет спецификации типа для объявления переменной, поэтому механизм JavaScript не имеет понятия о типе.

Только при вызове метода или свойства доступа JavaScrip выдаст вам сообщение об ошибке.

a:any[] ..

// this will give an error TypeError: .map is not a function
a.map( ()=> ... )

a.length // this is undefined.. any member of any object is
// essentially undefined, there is no type error when you access
// member

Ответ 4

  • только любое, используемое для одного объекта любого типа.
  • Любой [] предназначен для массива объектов с типом Any.