我使用TypeScript泛型来指定函数接受的参数类型。如下所示,Foo
和Bar
都有一个名为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();
}
游乐场链接