-
Notifications
You must be signed in to change notification settings - Fork 46
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
3609cd4
commit b49a982
Showing
1 changed file
with
75 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -86,15 +86,15 @@ enum Visibility { Visible, Hidden } | |
const state: Visibility = Visibility.Visible; // 0 | ||
``` | ||
|
||
### object vs Object vs {} | ||
### `object` vs `Object` vs `{}` | ||
- `object` — **непримитивный тип** (non-primitive); *любой тип*, *кроме [примитивных](#примитивные-типы)*. | ||
```ts | ||
let foo: object; | ||
foo = { prop: 'value' }; | ||
foo = ['value']; | ||
foo = ():void => console.log('notes'); | ||
``` | ||
- `Object` — любой **JavaScript-объект** (соответствует интерфейсу `Object`, включающему в себя `toString()`, `valueOf()`, `hasOwnProperty()` и другие методы). | ||
- `Object` — любой **JavaScript-объект** (соответствует интерфейсу `Object`, имеющий методы `toString()`, `valueOf()`, `hasOwnProperty()` и другие). | ||
```ts | ||
let obj: Object; | ||
obj = {}; | ||
|
@@ -106,17 +106,80 @@ interface Object { | |
/* ... */ | ||
} | ||
``` | ||
|
||
Фактически, `object` и `Object` очень похожи, поскольку все непримитивные типы в JavaScript происходят от объектов, так в чём же отличие? | ||
|
||
По сути, разница лишь в хайлайтинге: | ||
```ts | ||
const foo: Object = function (){}; // ок | ||
const bar: Object = function (){}; // ок | ||
|
||
foo. // покажет доступные методы | ||
bar. // не покажет ничего | ||
|
||
// но при этом | ||
foo.toString() // нет ошибки | ||
bar.toString() // нет ошибки | ||
``` | ||
Проведя больше тестов, я выяснил, что разница в поведении между ними касается лишь типа `Symbol`. | ||
```ts | ||
const func1: Object = function (){}; // ок | ||
const func2: Object = function (){}; // ок | ||
func1() // ошибка TS: `This expression is not callable. Type 'Object' has no call signatures` | ||
func2() // ошибка TS: `This expression is not callable. Type '{}' has no call signatures` | ||
|
||
const arr1: Object = []; // ок | ||
const arr2: object = []; // ок | ||
arr1.fill(2); // `Property 'fill' does not exist on type 'Object'` | ||
arr2.fill(2); // `Property 'fill' does not exist on type 'object'` | ||
|
||
const symbol1: Object = Symbol(''); // ок | ||
const symbol2: object = Symbol(''); // ошибка TS: `Type 'typeof symbol2' is not assignable to type 'object'` | ||
|
||
const boolean1: Object = new Boolean(true); // ок | ||
const boolean2: object = new Boolean(true); // ок | ||
|
||
const promise1: Object = Promise.resolve(true); // ок | ||
const promise2: object = Promise.resolve(true); // ок | ||
promise1.then(() => {}); // `Property 'then' does not exist on type 'Object'` | ||
promise2.then(() => {}); // `Property 'then' does not exist on type 'object'` | ||
``` | ||
|
||
|
||
- `{}` — **пустой тип**, **пустой объект**. | ||
Обращение к его свойствам приведёт к ошибке, но остаётся возможность использовать все методы `Object`. | ||
```ts | ||
const foo = {}; | ||
foo.a = 'notes'; // Error: Property 'a' does not exist on type '{}' | ||
if (true) { | ||
foo.a = 'notes'; // Error: Property 'a' does not exist on type '{}' | ||
} | ||
console.log(foo.toString()); // '[object Object]' | ||
``` | ||
<!-- | ||
# Поддержка ООП в TypeScriot | ||
|
||
TypeScript предоставляет полноценную поддержку классов из ООП, JavaScript предоставляет лишь частичную поддержку. --> | ||
Стоит отметить, что тип `{}` задаётся автоматически, если присвоить пустой объект на этапе создания переменной вне зависимости от того, это `let` или `const`. | ||
```typescript | ||
const a = {}; | ||
a.foo = 1; // ошибка TS `Property 'foo' does not exist on type '{}'` | ||
let b = {}; | ||
b.bar = 2; // ошибка TS `Property 'bar' does not exist on type '{}'` | ||
|
||
// можно задать тип явно | ||
const a: {} = {} | ||
|
||
// можно сбить пользователя с толку | ||
const env: {} = { // ошибки при объявлении нет | ||
OS: 'win32', | ||
} | ||
env.OS /* ошибка TS: `Property 'OS' does not exist on type '{}'`, | ||
нет подсказок, какие свойства есть в объекте, но при этом значение `win32` возвращается | ||
*/ | ||
|
||
// тот же самый трюк с функцией, возвращающей `{}` | ||
const getUserData = (): {} => ({ email: '[email protected]' }); | ||
const user = getUserData(); | ||
user.email; /* вернёт '[email protected]', но подсказки о том, что свойство `email` сущесвует, не будет, | ||
а также будет ошибка TS `Property 'email' does not exist on type '{}'` */ | ||
``` | ||
|
||
### Детальный разбор `void` | ||
|
||
|
@@ -199,6 +262,12 @@ Object.entries(Color) // [["RED", "red"], ["YELLOW", "yellow"], ["GREEN", "green | |
|
||
# Класс (Class) | ||
|
||
|
||
<!-- | ||
# Поддержка ООП в TypeScriot | ||
TypeScript предоставляет полноценную поддержку классов из ООП, JavaScript предоставляет лишь частичную поддержку. --> | ||
|
||
**Классом** (англ. `class`) называют конструктор (строитель, генератор, создатель) объектов. В теле класса содержится вся информация, которую будет содержать объект после создания. | ||
|
||
- [Объявление класса](#объявление-класса) | ||
|