Вывод вложенного универсального типа typescript

#typescript

#typescript

Вопрос:

Я пытаюсь сделать что-то вроде следующего:

 function test<
  Feature extends { shape: Geometry; properties: Properties },
  Geometry extends geojson.Geometry,
  Properties extends {}
>() {
  const addFeature = (feature: Feature) => {
    switch (feature.shape.type) {
      case "Point":
        break;
    }
  };

  return {
    addFeature,
  };
}

test<{ shape: GeoJSON.Polygon; properties: {} }, GeoJSON.Polygon, {}>();

 

Есть ли какой-либо способ не требовать передачи второго общего и третьего общего? Я хочу иметь возможность сделать это:

 test<{ shape: GeoJSON.Polygon; properties: {} }>();
 

и пусть typescript выведет два других общих типа

Ответ №1:

Вы можете полностью опустить определение функции, поскольку оно зависит от Geometry и Properties

 function test<
  Geometry extends GeoJSON.Geometry,
  Properties extends {},
>() {
  const addFeature = (feature: { shape: Geometry; properties: Properties }) => {
    switch (feature.shape.type) {
      case "Point":
        break;
    }
  };

  return {
    addFeature,
  };
}

test<GeoJSON.Polygon, {}>();
 

или определите его в другом месте

 type Feature<G extends GeoJSON.Geometry, P extends {}> = {
  shape: G;
  properties: P;
}

function test<
  Geometry extends GeoJSON.Geometry,
  Properties extends {},
>() {
  const addFeature = (feature: Feature<Geometry, Properties>) => {
    switch (feature.shape.type) {
      case "Point":
        break;
    }
  };

  return {
    addFeature,
  };
}

test<GeoJSON.Polygon, {}>();
 

но у него все равно будут некоторые проблемы, если у вас много функциональных возможностей