小编bjn*_*nsn的帖子

在Typescript泛型中约束类型是几种类型之一

我试图将泛型的输入限制为几种类型之一.我发现最接近的符号是使用联合类型.这是一个简单的例子:

interface IDict<TKey extends string | number, TVal> { 
    // Error! An index signature parameter type must be 
    // a 'string' or a 'number'
    [key: TKey]: TVal; 
}

declare const dictA: IDict<string, Foo>;
declare const dictB: IDict<number, Foo>;
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我正在寻找的是一种方式,它TKey应该是或者是,string或者number不是它们的结合.

思考?

注意:这是一个更广泛问题的具体案例.例如,我有另一种情况,我有一个接受的函数text可以是a stringStructuredText(解析Markdown),转换它,并返回完全相应的类型(不是子类型).

function formatText<T extends string | StructuredText>(text: T): T {/*...*/}
Run Code Online (Sandbox Code Playgroud)

从技术上讲,我可以把它写成一个重载,但这似乎不是正确的方法.

function formatText(text: string): string;
function formatText(text: StructuredText): StructuredText;
function formatText(text) {/*...*/}
Run Code Online (Sandbox Code Playgroud)

过载也证明是有问题的,因为它不接受联合类型:

interface StructuredText { tokens: string[] …
Run Code Online (Sandbox Code Playgroud)

generics discriminated-union typescript

12
推荐指数
1
解决办法
3802
查看次数

标签 统计

discriminated-union ×1

generics ×1

typescript ×1