我正在尝试创建一个对象,该对象的属性依赖于另一个属性。
这是一个非常简单的例子,我尝试到目前为止。
我期望从name
推断出T
。value
应该限制为TypeA
中的有效值。
type TypeA = {
some: 'some2';
thing: 'thing2';
};
type TypeAUnion = keyof TypeA;
type TestType<T extends TypeAUnion = TypeAUnion> = {
name: T;
value: TypeA[T];
};
const test1: TestType = {
name: 'some',
value: 'some2',
};
const test2: TestType = {
name: 'some',
value: 'thing2', // shouldn't be allowed here
};
编辑:
这是一个更好的例子来说明我想做的事情。
type StateType = {
thingA: string;
thingB: number;
};
type StateKeysUnion = keyof StateType;
const state: StateType = {
thingA: 'somestring',
thingB: 10,
};
type PayloadType<T extends StateKeysUnion = StateKeysUnion> = {
key: T;
value: StateType[T];
};
const setThing = (payload: PayloadType) => {
state[payload.key] = payload.value;
};
setThing({
key: 'thingA',
// expected to only accept string
value: true,
});
setThing({
key: 'thingB',
// expected to only accept number
value: 'asdas',
});
1条答案
按热度按时间1sbrub3j1#
你要做的事情不能用泛型类型来表达。
如果要在通用字段中指定
some
但是,因为您不是,
T
默认为keyof TypeA
,并允许您混合和匹配。您应该改用@jcalz union approach。:)