请考虑以下示例:
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'.
答案 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;
}
}