Как я могу обнаружить экземпляр класса с обобщениями в машинописи - PullRequest
2 голосов
/ 17 апреля 2020

Я пытаюсь создать функцию, которая принимает два параметра, первый - это ссылка на класс, а второй - это функция с одним параметром, который является экземпляром ссылки на класс, а вывод - это определенный c тип. , Я попробовал приведенный ниже код, но машинопись показывает мне неизвестный тип для p, хотя я надеюсь, что p был экземпляром Pair.

interface Point{
    x: number
    y: number
}
class Pair{
    key = 0
    value = 0
}
function set<Class extends { new (): Type }, Type>(
    inputClass: Class,
    constructor: (o: Type) => Point) {
    //implementation...
}
set(Pair, p => ({x: p.key, y: p.value}))
// Typescript says:
// (parameter) p: unknown
// Object is of type 'unknown'.(2571)

Я хотел, чтобы машинопись знала, что p должен быть экземпляром Pair


Мне удалось реализовать с использованием java обобщений, но я все еще не могу воспроизвести в машинописи. Следуйте коду:

public <K extends Pair, T extends Class<K>> void setRenderer(T classe, Function<K, Point> constructor){
    //implementation
}

Ответы [ 3 ]

2 голосов
/ 18 апреля 2020

Это должно работать:

function set<C>(
    inputClass: new ()=>C,
    constructor: (o: C) => Point) {
    //implementation...
}

Машинописная площадка

1 голос
/ 18 апреля 2020

Обобщения не работают так, вывод типа не go таким образом.

Простое решение:

interface Point{
    x: number
    y: number
}
class Pair{
    key = 0
    value = 0
}
declare function set<Type>(constructor: (o: Type) => Point): void;

set<Pair>(p => ({ x: p.key, y: p.value }))

Или, если вы действительно хотите перейти в класс :

interface Point{
    x: number
    y: number
}
class Pair{
    key = 0
    value = 0
}
function set<Type>(
    inputClass: { new (): Type },
    constructor: (o: Type) => Point) {
    //implementation...
}
set(Pair, p => ({ x: p.key, y: p.value }))
0 голосов
/ 18 апреля 2020

Я не совсем уверен, зачем вам здесь нужны классы.

Вы можете достичь того, что ищете, с помощью интерфейсов, например:

interface Point{
    x: number
    y: number
}

interface Pair{
    key:number
    value:number
}
const instance: Pair = {
    key : 0,
    value : 0
}

function set(value: Pair):Point {
    return  ({x: value.key, y: value.value})
}

Playground

Или, если вы действительно хотите занятия, вы можете сделать следующее:

Площадка для занятий

...