使用引用时,Typescript省略不显示错误

使用引用时,Typescript省略不显示错误,typescript,typescript-types,Typescript,Typescript Types,我原以为这会有一些智能感知错误,但事实并非如此。然而,这确实显示出一些错误,有人知道为什么吗 type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>; interface objInterface { first: string; second: string; } const obj = { first: "first", second: "second" }; co

我原以为这会有一些智能感知错误,但事实并非如此。然而,这确实显示出一些错误,有人知道为什么吗

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;

interface objInterface {
  first: string;
  second: string;
}

const obj = {
  first: "first",
  second: "second"
};

const out: Omit<objInterface, "first"> = obj;

根据设计,将对象定义为文字时,仅在多余属性上出错

TS在设计中将对象定义为文字时,仅在多余属性上出现错误

除了@kingdaro关于对对象文本进行过多属性检查的正确观点之外

省略的定义只是拓宽了T的类型,使其在K处不包含已知属性,我不知道或不关心K是否为属性;我将忽略它,这与禁止K处的属性不同。也就是说,T是Omit的子类型,并且类型T的任何值也可以分配给类型Omit。如果您的意图是实际禁止K上的属性,那么可以通过指定K属性是可选的,并且其值类型为never或undefined来实现这一点,请参见下文。让我们称之为强制限制:

让我们看看它是否有效:

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
type ForcefullyOmit<T, K extends keyof T> = Omit<T, K> & Partial<Record<K, never>>; 
看起来不错

这只是一种禁止键的方式,因为它仍然允许该键上的属性类型为undefined或never,但这是一种类型内脚本。。。这种语言并不总是区分缺少的属性和未定义的属性


如果您的用例真的需要更严格的强制限制行为,这取决于您。无论如何,希望这有帮助;祝你好运

除了@kingdaro关于对对象文本进行过多属性检查的正确观点之外

省略的定义只是拓宽了T的类型,使其在K处不包含已知属性,我不知道或不关心K是否为属性;我将忽略它,这与禁止K处的属性不同。也就是说,T是Omit的子类型,并且类型T的任何值也可以分配给类型Omit。如果您的意图是实际禁止K上的属性,那么可以通过指定K属性是可选的,并且其值类型为never或undefined来实现这一点,请参见下文。让我们称之为强制限制:

让我们看看它是否有效:

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
type ForcefullyOmit<T, K extends keyof T> = Omit<T, K> & Partial<Record<K, never>>; 
看起来不错

这只是一种禁止键的方式,因为它仍然允许该键上的属性类型为undefined或never,但这是一种类型内脚本。。。这种语言并不总是区分缺少的属性和未定义的属性

如果您的用例真的需要更严格的强制限制行为,这取决于您。无论如何,希望这有帮助;祝你好运

interface ObjInterface {
  first: string;
  second: string;
}

const obj = {
  first: "first",
  second: "second"
};

const out: ForcefullyOmit<ObjInterface, "first"> = obj; // error
// types of property "first" are incompatible
// string is not assignable to undefined