我正在try 缩小泛型的范围,其中自动补全检测到它正在命中类型保护,因此不会再次到达相同的代码块.我认为原因是我没有将类型限制为泛型,但我不确定我将如何做到这一点,这是可能的吗?感觉这应该是可能的,但我不确定.任何帮助都将不胜感激.
// Setup
export type Feature<Geometry> = {
type: 'Feature',
geometry: Geometry
}
type Geometry = Point | Curve
interface Base {
type: string
}
interface Point extends Base{
type: 'Point'
}
interface Curve extends Base {
type: 'Curve'
}
// Typeguard
function isGeometry<G extends Geometry, U extends G['type']>(geometry: G, disciminator: U): geometry is Extract<G, {type: U}>{
return geometry.type === disciminator
}
function isFeature<G extends Geometry, U extends G['type']>(feature: Feature<G>, disciminator: U): feature is Feature<Extract<G, {type: U}>> {
return feature.geometry.type === disciminator
}
function whatGeometry(feature: Feature<Point | Curve>) {
if(isGeometry(feature.geometry, 'Curve')){
return feature.geometry;
// ^?
}
if(isGeometry(feature.geometry, 'Point')){
return feature.geometry;
// ^?
} // Autocompletes, and knows that we can't have anything else for a geometry,
return;
}
function whatFeature(feature: Feature<Point | Curve>) {
if(isFeature(feature, 'Curve')){
return feature.geometry;
// ^?
}
if(isFeature(feature, 'Point')) {
return feature;
// ^?
} // Assumes we can have another Feature<Point> even though the upper typeguard should have caught it
return;
}