Size: a a a

JavaScript.Ninja

2020 April 03

А

Алексей in JavaScript.Ninja
m^^combat
interface Shape { name: string };
interface Circle extends Shape { width: number };
interface Rectangle extends Circle { height: number };
declare var logSC: (figure: Shape) => Circle;
declare var logRC: (figure: Rectangle) => Circle;
declare var wlogBB: (fn: (figure: Circle) => any) => void;

wlogBB(logSC);
// Error with --strictFunctionTypes
wlogBB(logRC);
Если функция ожидает обработчик Circle, а ей передают обработчик ее потомка, то может быть ошибка, так как обрабатывать она будет именно Circle, а не его наследников. А обработчик наследника может не уметь работать с базовым классом
источник

m

m^^combat in JavaScript.Ninja
не понял так потомок это супер сет свойст родителя
источник

m

m^^combat in JavaScript.Ninja
почему должна быть ошибка
источник

m

m^^combat in JavaScript.Ninja
у Rectangle есть все что есть у Circle
источник

А

Алексей in JavaScript.Ninja
const logRC =  (item) => item.height * 2
источник

А

Алексей in JavaScript.Ninja
Это обработчик
источник

А

Алексей in JavaScript.Ninja
В него wlogBB может передать объект без height
источник

m

m^^combat in JavaScript.Ninja
ну да тут имеет смысл
источник

m

m^^combat in JavaScript.Ninja
а вот еще пример:

interface RequestWithModels extends Request {
 model: {smth: 'smth'};
}

interface ObjectWithFunction {
 fn: (param: Request) => any;
}

const objectWithFunction: ObjectWithFunction = {
 // тут ошибка
 fn: (param: RequestWithModels) {
   console.log(param)
 }
}
источник

А

Алексей in JavaScript.Ninja
Ну опять же, ты сужаешь облать применения функции-обработчика: пытаешься его выдать за такой, который все реквесты обрабатывает (а он только особенные, согласно тайпингу). В других языках у тебя тоже будет ошибка.
источник

А

Алексей in JavaScript.Ninja
Функции, которые используют базовый тип, должны иметь возможность использовать подтипы базового типа, не зная об этом.
https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D0%BF%D0%BE%D0%B4%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B8_%D0%91%D0%B0%D1%80%D0%B1%D0%B0%D1%80%D1%8B_%D0%9B%D0%B8%D1%81%D0%BA%D0%BE%D0%B2

А ты пытаешься наоборот сделать
источник

m

m^^combat in JavaScript.Ninja
почему сужаю тут?
objectWithFunction.fn({model: {smth: 'smth'}, requestProp: 'requestProp'})
источник

m

m^^combat in JavaScript.Ninja
я расширяю а не сужаю
источник

А

Алексей in JavaScript.Ninja
fn: (param: RequestWithModels) { <—- ты говоришь, я буду принимать только RequestWithModels (и его потомков). Тогда как базовый интерфейс может и обычный Request принять.
источник

А

Алексей in JavaScript.Ninja
interface RequestWithModels {
 model: {smth: 'smth'};
}

interface ObjectWithFunction {
 fn: (param: Request) => any;
}

const objectWithFunction: ObjectWithFunction = {
 // тут ошибка
 fn: (param: Request | RequestWithModels) {
   console.log(param)
 }
}
источник

А

Алексей in JavaScript.Ninja
Вот так ты расширишь, то есть у тебя функция и обычный Request примет и {
 model: {smth: 'smth'};
}
источник

m

m^^combat in JavaScript.Ninja
понятно))) спасибо за обьяснение
источник

IK

Illya Klymov in JavaScript.Ninja
Тут не все так просто :)
источник

IK

Illya Klymov in JavaScript.Ninja
m^^combat
понятно))) спасибо за обьяснение
Аргументы функции могут быть выходами :)
источник

m

m^^combat in JavaScript.Ninja
Illya Klymov
Аргументы функции могут быть выходами :)
обьясни?)
источник