我试图将泛型的输入限制为几种类型之一.我发现最接近的符号是使用联合类型.这是一个简单的例子:
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 string或StructuredText(解析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)