Извлечь интерфейс функции с дженериками в отдельную переменную типа/интерфейса

avatar
Susitha Ravinda Senarath
1 июля 2021 в 19:07
35
1
0

Ниже приведен общий пример машинописного текста, который я получил от typescriptlang.

function getProperty<Type, Key extends keyof Type>(obj: Type, key: Key) {
  return obj[key];
}

let x = { a: 1, b: 2, c: 3, d: 4 };

getProperty(x, "a");
getProperty(x, "m");

Можно ли извлечь универсальный тип в переменную типа для его повторного использования? Пробовал, но выдает ошибку

type MyType<Type, Key extends keyof Type> = {obj: Type, key: Key}

let x = { a: 1, b: 2, c: 3, d: 4 };


function getPropertyGeneric(params: MyType<x>) {
  return obj[key];
}

ошибка

Generic type 'MyType' requires 2 type argument(s).

Детская площадка

Источник
Explosion Pills
1 июля 2021 в 19:09
1

Я немного смущен вашим вопросом... можете ли вы привести пример результата, который вы ищете?

Susitha Ravinda Senarath
1 июля 2021 в 19:16
0

@ExplosionPills Второй блок кода. Если я смогу извлечь общий тип в MyType. На самом деле я хотел этого, потому что я пытаюсь создать избыточный тип действия для аналогичного сценария. Мне нужно определить тип параметра как отдельный тип.

Ответы (1)

avatar
aleksxor
1 июля 2021 в 19:32
3

Для типа, определенного как:

type MyType<Type, Key extends keyof Type> = {obj: Type, key: Key}

вы должны явно указать 2 параметра типа:

function getPropertyGeneric(params: MyType<typeof x, keyof typeof x>) {
  return params.obj[params.key];
}

ссылка на игровую площадку

Но вы можете использовать общий параметр по умолчанию для параметра второго типа. И определите MyType как:

type MyType<Type, Key extends keyof Type = keyof Type> = {obj: Type, key: Key}

Вы можете указать или опустить параметр второго типа:

function getPropertyGeneric2(params: MyType<typeof x, keyof typeof x>) { // no error
  return params.obj[params.key];
}

function getPropertyGeneric1(params: MyType<typeof x>) { // no error
  return params.obj[params.key];
}

ссылка на игровую площадку

Также обратите внимание, что вы не можете использовать value x в позиции type. Вы должны получить его тип с помощью оператора typeof.

Susitha Ravinda Senarath
2 июля 2021 в 07:41
0

Не знал о типах по умолчанию. Спасибо