khusamov
@khusamov
ReactJS, NodeJS, TypeScript, Sencha ExtJS

Как отличить класс от объекта или простой функции в Typescript-е?

Как отличить класс от объекта или простой функции в Typescript-е?

Всякие typeof и instanceof тут не помогают.
А мне нужно знать, что я на входе получил - класс или его экземпляр.
Ну и как на входе функции пометить, что один из аргументов функции будет класс?
  • Вопрос задан
  • 268 просмотров
Решения вопроса 1
@artemt
Full-stack developer
Что значит "один из аргументов функции будет класс"? Это же всё равно будет функция, но представляющая некий класс в структуре программы. Ну можно конечно получать в качестве аргумента либо функцию, которая создаст нам объект, либо уже созданный объект. Только зачем? Как-то не очень понятна цель.

А помечать можно интерфейсами, вот пример из документации:
interface ClockConstructor {
    new (hour: number, minute: number): ClockInterface;
}
interface ClockInterface {
    tick();
}

function createClock(ctor: ClockConstructor, hour: number, minute: number): ClockInterface {
    return new ctor(hour, minute);
}

class DigitalClock implements ClockInterface {
    constructor(h: number, m: number) { }
    tick() {
        console.log("beep beep");
    }
}
class AnalogClock implements ClockInterface {
    constructor(h: number, m: number) { }
    tick() {
        console.log("tick tock");
    }
}

let digital = createClock(DigitalClock, 12, 17);
let analog = createClock(AnalogClock, 7, 32);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
k12th
@k12th
console.log(`You're pulling my leg, right?`);
Ну и как на входе функции пометить, что один из аргументов функции будет класс?


С помощью typeof:
class Greeter {
    greeting: string;
    constructor(message: string) {
        this.greeting = message;
    }
    greet() {
        return "Hello, " + this.greeting;
    }
}

function useGreeter(cls: typeof Greeter): Greeter {
    return new cls("world");
}

useGreeter(Greeter);

Если попробовать вызвать useGreeter(function () {});, то TS скажет, что сигнатура не совпадает, ЧТиД.

Класс от простой функции в рантайме отличить нельзя, мне кажется. С точки зрения JS -- и то и другое функция. Можно декорировать все нужные классы каким-то свойством -- если оно есть, то это класс, но это не очень изящно.
Отличить класс от объекта просто, первое это функция, второе -- нет:)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы