gpt4 book ai didi

typescript - 使用 infer 关键字创建反向类型查找?

转载 作者:行者123 更新时间:2023-12-04 14:52:06 26 4
gpt4 key购买 nike

<分区>

这是我所拥有的,我有各种类型,并且我有该类型的字符串表示形式:

type PossibleValueTypes = Color | number | Position;
type PossibleValueTypesAsString = "color" | "number" | "position";

type ValueTypeMap = {
"color" : Color;
"number" : number;
"position" : Position;
};

现在,给出一个给定的字符串表示,返回值类型就足够简单了,例如;


function generateRandomValueOfType<T extends PossibleValueTypesAsString>(type: T) : ValueTypeMap[T] {
if (type === 'color') {
return {
r: 1,
g: 1,
b: 1,
a: 1,
} as ValueTypeMap[T]
}
if (type === "position") {
return {
x:1,
y: 1
} as ValueTypeMap[T]
}

if (type === "number") {
return 1 as ValueTypeMap[T];
}

throw new Error ("We shouldn't have got here");
};


const a: Position = generateRandomValueOfType("position");
const b: number = generateRandomValueOfType("position"); // Expected error!

现在的问题是 - 如果我想做相反的事情,即 - 给定一个值类型,确定字符串表示形式。

我最好的办法是做一个链式条件,比如:

type ReverseValueTypeLookup<T extends PossibleValueTypes>  = T extends Color ? "color" : T extends number ? "number" : T extends Position ? "position": never; 

function hasAValueAcceptingCallback<T extends PossibleValueTypes> (callback: (value: T) => void, valueTypeAsString: ReverseValueTypeLookup<T>) {
const value = generateRandomValueOfType(valueTypeAsString);

//Argument of type 'ValueTypeMap[ReverseValueTypeLookup<T>]' is not assignable to parameter of type 'T'.
//'ValueTypeMap[ReverseValueTypeLookup<T>]' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'PossibleValueTypes'.
callback(value);
}






但这在我给出的示例中实际上不起作用。

是否有更简洁的方法来实现我在这里尝试做的两件事?

TS Playground

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com