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

时间:2021-04-06 16:25:20

标签: 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+-YkJHQxE6X3mKyVAA7FoADQCaALWgAXjhEaAAfaHVCaVQAM0FOcmx4bmZIAB5fPwA+GgAPJiy6CywBYW48gDpcAhJySlo6aVkgA

1 个答案:

答案 0 :(得分:2)

您对多个事物使用相同的名称。因此,虽然您认为 SELECT B.trans_id, B.[name] FROM dbo.TableB B WHERE EXISTS(SELECT 1 FROM dbo.TableA A WHERE A.ID_Trans = B.trans_id); --Odd that it's called ID_Trans in one table, and Trans_ID in another 都是相关的,但实际上并非如此。让我给它们起个独特的名字,这样就清楚什么是什么:

XYZ

函数 type XYZ = Foo | Bar; function bas<T>(x: T) { return x.isDirectory(); } 是一个泛型,它接受任何类型的 bas。它与您之前定义的几行的 XYZ 没有关系。由于 T 可以是任何东西(例如,T),因此不能保证它会有 number 函数。

您可能想要做的是限制 isDirectory 使其只能是 T 或从它扩展的某些内容:

XYZ

Playground link