constructor
любого типа T
, который является подтипом типа { new (...args: any[]): {} }
{ new (...args: any[]): {} }
- это абсолютно тоже самое, что и new (...args: any[]) => {}
. Это сигнатура конструктора, с любым количеством любых элементов и инстанциирующий значение с типом {}
.{}
- это множество всех не нулевых значений (не только объектов), то есть по сути это как тип any, но без null | undefined
и с не сломанной вариантностью. Здесь его безболезненно можно заменить на тип unknown
, в отличии от тех же аргументов, где из-за контрвариантности аргументов функций (и конструкторов) предикаты на типах ломаются и без any нормально не сделать.<!DOCTYPE html>
<head>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="wrapper">
<header class="header">Header</header>
<main class="main">Main</main>
<footer class="footer">Footer</footer>
</div>
</body>
</html>
html, body {
height: 100%;
margin: 0;
font-family: Helvetica;
font-size: 25px;
}
.wrapper {
min-height: 100%;
display: flex;
flex-direction: column;
}
.header {
background-color: lightsalmon;
text-align: center;
padding: 30px;
}
.main {
text-align: center;
padding: 30px;
flex: 1 1 auto;
}
.footer {
background-color: lightseagreen;
text-align: center;
padding: 30px;
}
function Rabbit() {}
console.log(Object.getOwnPropertyDescriptor(Rabbit, 'prototype')); // { value: {}, writable: true, enumerable: false, configurable: false }
class Rabbit {}
console.log(Object.getOwnPropertyDescriptor(Rabbit, 'prototype')); // { value: {}, writable: false, enumerable: false, configurable: false }
'use strict';
Rabbit.prototype = {};
TypeError: Cannot assign to read only property 'prototype' of function 'class Rabbit {}'