TypeScript抱怨泛型函数中不存在属性



我使用TypeScript泛型来指定函数接受的参数类型。如下所示,FooBar都有一个名为isDirectory的函数,但在泛型函数中似乎无效。有人能解释一下我在这里缺了什么吗?

class Foo {
isDirectory(): boolean {
return true;
}
}
class Bar {
isDirectory(): boolean {
return true;
}
}
type XYZ = Foo | Bar;
function bas<XYZ>(x: XYZ) {
!!!!!!!! Property 'isDirectory' does not exist on type 'XYZ'.(2339)
return x.isDirectory();
}

我知道我可以用extends扩展泛型类型,但为什么在这种情况下需要这样做呢?有没有一个不用手动键入接口的解决方案?

https://www.typescriptlang.org/play?#code/MYGwhgzhAEBiD29oG8BQrqegSwgEWwCcBTYAF3kIE8AKASgC5oAjREYsAOxQyz5LIBXQtzKFBxANy9MAX1TzUoSDABCYQjxk58RUhWr0mreOy48+-YkJHQxE6X3mKyVAA7FoADQCaALWAXjhEaAAfaHVCaVQAM0FOcmx4bmZIAB5fPwA+GgAPJiy6CywBYW48gDpcAhJySlo6aVkgA

您对多个事物使用相同的名称。所以,虽然你认为XYZ都是相关的,但事实并非如此。让我给他们起唯一的名字,这样就清楚什么是了

type XYZ = Foo | Bar;
function bas<T>(x: T) {
return x.isDirectory();
}

函数bas是接受任何类型T的泛型。它与您之前定义的几行XYZ没有关系。由于T可以是任何东西(比如number(,所以不能保证它上面会有isDirectory函数

你可能想做的是限制T,使其只能是XYZ,或者从它扩展而来的东西:

type XYZ = Foo | Bar;
function bas<T extends XYZ>(x: T) {
return x.isDirectory();
}

游乐场链接

最新更新