【发布时间】:2020-07-30 03:58:59
【问题描述】:
我正在定义一个需要接受string 和object 类型的数组。 object 类型必须包含两个属性:name 和 value。 value 必须是另一个对象,包含任意一组 key: value 对。
我正在尝试使用可区分的联合定义一些object 类型,以便知道某些特定name 的value 的属性。但是,始终需要保留一个后备,以便当 name 不是已知的字符串文字时,value 仍然可以是任意集合。
这是我目前正在使用的:
interface IFallbackDef {
name: string;
value: object;
}
type ValueDef<TName extends string = string, TOptions extends object = {}> = {
name: TName;
value: TOptions;
};
type Merged<TValueDef extends ValueDef> = (string | TValueDef | IFallbackDef)[];
interface ITest1Options {
foo: string;
bar: string;
}
interface ITest2Options {
baz: string;
qux: string;
}
const test: Merged<
| ValueDef<'test1', ITest1Options>
| ValueDef<'test2', ITest2Options>
> = [
'asdf',
{
name: 'test1',
value: {
foo: 'asdjfkl',
bar: 'asdf',
/**
* Intellisense shows both sets of properties,
* and typescript allows them all, too
*/
qux: 'asdfkljsdg' // This should be an error
}
},
{
name: 'test2',
value: {
baz: 'blah',
qux: 'test',
/**
* Intellisense shows both sets of properties,
* and typescript allows them all, too
*/
foo: 'salfdj' // This should be an error
}
},
{
name: 'asdf',
value: {
/**
* Intellisense shows both sets of properties,
* should show none.
*/
},
},
]
我遇到的问题是,当我在联合中包含 IFallbackDef 时,各种 value 属性的所有类型都会合并。如果我排除IFallbackDef,联合工作正常,但test数组的最后一个索引会出错,因为name: 'asdf'是未知的。
我假设因为IFallbackDef 使用基本类型,并且形状与IValueDef 相同,所以它正在合并类型......?目前,我对如何使其正常工作感到不知所措。非常感谢您有一双新鲜的眼睛。
【问题讨论】:
标签: typescript typescript-generics