Typescript TS实用程序类型信息丢失,带有“S”;“类型”;操作人员

Typescript TS实用程序类型信息丢失,带有“S”;“类型”;操作人员,typescript,typescript-typings,Typescript,Typescript Typings,我最近发现了TS typeof操作符丢失重要类型信息的情况。我怀疑这确实是我的误解,但幸运的是,很容易说明: const omit = <T extends object, K extends keyof T>(dict: T, key: K) => { return dict as Omit<T, K>; }; // implicit object const obj = { foo: 1, bar: 2 }; // full type info ava

我最近发现了TS typeof操作符丢失重要类型信息的情况。我怀疑这确实是我的误解,但幸运的是,很容易说明:

const omit = <T extends object, K extends keyof T>(dict: T, key: K) => {
    return dict as Omit<T, K>;
};

// implicit object
const obj = { foo: 1, bar: 2 };
// full type info available after "omit"
const obj2 = omit(obj, "bar");
// type info is "lossy"
type O2 = typeof obj2;
下游类型定义(如
O2
O4
)是否可以捕获完整的类型信息?我知道,在许多情况下,这种简化状态实际上是首选的,因为它既简单又准确,使搜索更容易,但在更复杂的环境中,这种丢失的信息有助于保留


我注意到,如果我创建一个identity函数并通过identity函数分配另一个变量,它会保留类型信息。这是有用的,尽管它不能完全解决我的问题

例如:

const omit = <T extends object, K extends keyof T>(dict: T, key: K) => {
    return dict as Omit<T, K>;
};

function identity<T>(thing: T):T {
    return thing;
} 

// implicit object
const obj = { foo: 1, bar: 2 };
// full type info available after "omit"
const obj2 = omit(obj, "bar");
const myObj = identity(obj2);
type O2 = typeof myObj;
const-omit=(dict:T,key:K)=>{
返回dict作为省略;
};
函数标识(thing:T):T{
归还物;
} 
//隐式对象
常量obj={foo:1,bar:2};
//“省略”后可用的完整类型信息
常量obj2=省略(obj,“bar”);
常量myObj=标识(obj2);
O2型=myObj型;
obj2
myObj
的输入相同且完整<代码>氧气仍有损耗


向上投票是因为这个问题问得很好,尽管我感觉
typeof
操作符故意这样做,并且您可能必须根据省略函数的返回类型来存储类型。您能给出一个需要保留别名的用例吗?您的第二个示例保留了别名,因为泛型是如何工作的,但我仍然看不出
Omit
如何比
{foo:number;}
@olegvarter更有用。例如,您有一个流畅的API,并且希望“隐藏”API上的某些键。调用结构是递归的,每个迭代/api调用都希望从现有的键集进行修改。不确定这是否是一个足够好的解释。@evelynhathaway是的,我怀疑typeof的行为是这样的,但我的问题不是如何改变它的行为,而是如何产生我想要的结果。@OlegValter它与构建器模式很好地一致,在构建器模式中,您只暴露API表面上与per相关的部分通话基础。带有
a
b
c
端点的接口只能先公开
a
,然后公开
b
c
以及其他组合。您通常会使用泛型来屏蔽您不想要的道具,当您在Fluent API上递归时,您希望修改此类型,但要修改它,您必须确保它被保留。
const omit = <T extends object, K extends keyof T>(dict: T, key: K) => {
    return dict as Omit<T, K>;
};

function identity<T>(thing: T):T {
    return thing;
} 

// implicit object
const obj = { foo: 1, bar: 2 };
// full type info available after "omit"
const obj2 = omit(obj, "bar");
const myObj = identity(obj2);
type O2 = typeof myObj;