TypeScript函数,该函数返回与输入相同类型的值

时间:2018-07-05 15:59:14

标签: typescript generics return-type

请考虑以下示例:

interface HashMap<Type> {
  [key: string]: Type;
}

type StringVariations = (string | string[] | HashMap<string>);

function foo<Type extends StringVariations>(input: Type): Type {
    if ('string' === typeof input) {
        return 'foo';
    } else {
        return input;
    }
}

我有一个函数,可以接受各种类型的输入。但是,它总是返回与接收到的类型相同的类型。

在TypeScript中定义此方法的正确方法是什么?

上面的示例给我一个错误:Type '"foo"' is not assignable to type 'Type'.

1 个答案:

答案 0 :(得分:3)

问题在于即使您进行类型检查,Typescript也不会缩小泛型类型。根本没有实现这种行为。由于没有进行缩小,因此您分配给T的任何值对于任何可能的T必须有效。还要记住,给定类型,可以使用constaint派生类型,因此T可以是字符串文字类型,然后您的检查不足以确保正确的返回类型:

foo<'bar' >('bar') // Returns 'foo' but 'bar' is expected

如果要继续进行此操作,则将使用类型断言

function foo<Type = StringVariations>(input: Type): Type {
    if ('string' === typeof input) {
        return 'foo' as any;
    } else {
        return input;
    }
}