const minGap = 3;
const keys = ['name', 'price'];
const input = [
{
name: "абрикосы",
price: 20
},
{
name: "тыква",
price: 50
},
{
name: "уи",
price: 1000
}
];
const maxLengths = keys.slice().fill(0);
const normalizedInput = input.map(item => keys.reduce((acc, key, i) => {
const current = String(item[key]);
const currentLength = current.length;
if(currentLength > maxLengths[i])
maxLengths[i] = currentLength;
acc[key] = current;
acc.length += currentLength;
return acc;
}, { length: 0 }));
const maxLength = maxLengths.reduce(
(sum, current) => sum + current,
minGap
);
const res = normalizedInput
.map(({
name,
price,
length
}) => name + ' '.repeat(maxLength - length) + price)
.join('\n');
let key: keyof EventStatusType;
for (key in eventTypes) {
Typescript не может автоматически вывести тип key
потому что он структурный, и никак не может знать, что в объекте точно нет ещё каких-нибудь ключей, кроме тех что указаны в типе EventStatusType
: const foo = {
Closed: false,
Maintaince: false,
Open: false,
внезапно: 'Вася'
};
const bar: EventStatusType = foo; // ok
Поскольку с помощью кода в начале ты фактически говоришь Typescript: "я знаю лучше, там точно не будет ничего другого", то на всякий непредвиденный случай следует добавить в switch
default
который что-то сделает(например кинет ошибку) если таки лишний неведомый ключ прилетит.Maintaince
и Maintenance
. function getPropertyOfObject<T extends Record<PropertyKey, any>>(obj: T) {
const defaultKey = 'defaultKey';
function getProp<K extends keyof T>(keyOne: K): typeof defaultKey extends keyof T[K] ? T[K][typeof defaultKey] : void;
function getProp<K extends keyof T, K2 extends keyof T[K]>(keyOne: K, keyTwo: K2): T[K][K2];
function getProp(keyOne: PropertyKey, keyTwo?: PropertyKey) {
return obj?.[keyOne]?.[keyTwo ?? defaultKey];
}
return getProp;
}
REMOTE_ADDR
не подделать, но то в теории, потому что всякая кака на твоей стороне любит его подменять для удобства. Например нередко можно встретить глубоко в чужом коде подобную дыру:if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$xffaddrs = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);
$_SERVER['REMOTE_ADDR'] = $xffaddrs[0];
}
dev
, дизайнер от неё делает свою ветку feature
как обычно, потом когда пришло время делать MR - скриптом делается ещё одна ветка от feature
условно вида feature_to_dev_<date>
, и уже от неё делается MR в dev
, далее:feature
. dev
в feature
, если надо, дизайнер вливает через простой MR, и если есть конфликты - тыкает тебя, тут уж никак без остановки работы. Но, по идее, частых конфликтов быть не должно если регулярно вливали его работу в dev
.