如何将typescript对象中的属性限制为严格定义的属性

如何将typescript对象中的属性限制为严格定义的属性,typescript,Typescript,给定以下代码: interface t1 { prop1: string; } interface t2 { prop2: string; } type ts = t1 | t2; const t: ts = { prop1: 'foo', prop2: 'bar' } 为什么t对象是有效的?这是否可能被禁止,因此t只能是t1或t2,但不能同时是两者 可以在typescript游乐场上看到代码。如果接口兼容(即它们没有任何不同不兼容类型的属性),typescript将允许

给定以下代码:

interface t1 {
  prop1: string;
}

interface t2 {
  prop2: string;
}

type ts = t1 | t2;

const t: ts = {
  prop1: 'foo',
  prop2: 'bar'
}
为什么
t
对象是有效的?这是否可能被禁止,因此
t
只能是
t1
t2
,但不能同时是两者


可以在typescript游乐场上看到代码。

如果接口兼容(即它们没有任何不同不兼容类型的属性),typescript将允许您指定联合类型中的任何属性。我们可以定义一种类型,通过将其他类型的所有属性添加到union类型的每个类型中,确保对象文字仅与其中一个接口兼容:

type Diff<T extends string, U extends string> = ({[P in T]: P } & {[P in U]: never } & { [x: string]: never })[T];  
type Exclude<T, TExclude> = Partial<Record<Diff<keyof TExclude, keyof T>, never>>
type ts = (t1 & Exclude<t1,t2>) | (t2 & Exclude<t2, t1>);

interface t1 {
    prop1: string;
    prop4: string;
    propCommon: string;
}

interface t2 {
    prop2: string;
    propCommon: string;
}
const t: ts = { prop1: 'foo',prop2: 'bar', propCommon: ''}
const tt2: ts = {prop2: '', propCommon: ''}
const tt1: ts = {prop1: '', propCommon: '', prop4: ''}
type Diff=({[P in T]:P}&{[P in U]:never}&{[x:string]:never}[T];
类型Exclude=Partial
类型ts=(t1和排除)|(t2和排除);
接口t1{
prop1:字符串;
prop4:字符串;
普通:字符串;
}
接口t2{
prop2:字符串;
普通:字符串;
}
常量t:ts={prop1:'foo',prop2:'bar',propCommon:'}
常量tt2:ts={prop2:'',PROPCOMON:'}
常量tt1:ts={prop1:'',PROPCOMON:'',prop4:'}
对于3种类型,其用法如下:

type ts = (t1 & Exclude<t1,t2> & Exclude<t1, t3>) 
    | (t2 & Exclude<t2, t1> & Exclude<t1, t3>)
    | (t3 & Exclude<t3, t1> & Exclude<t3, t2>);
type ts=(t1&Exclude&Exclude)
|(t2&排除&排除)
|(t3&排除&排除);
我们还可以定义一些帮助器类型,使其看起来更好一些:

type Exclusive2<T, TExclude> = T & Exclude<T,TExclude>
type Exclusive3<T, TExclude, TExclude2> = T & Exclude<T,TExclude> & Exclude<T,TExclude2>
type Exclusive4<T, TExclude, TExclude2, TExclude3> = T & Exclude<T,TExclude> & Exclude<T,TExclude2> & Exclude<T, TExclude3>
type ts = Exclusive3<t1, t2, t3> | Exclusive3<t2, t1, t3> | Exclusive3<t3, t2, t1>
type Exclusive2=T&exclused
类型Exclusive3=T&Exclude&Exclude
类型Exclusive4=T&Exclude&Exclude&Exclude
ts型=排他E3 |排他E3 |排他E3

我认为您指的是“联合”而不是“交叉点”?除了产生非常困难的错误信息之外,这是一个不错的解决方案。谢谢大家!@RasmusHansen不幸的是,你不可能做到这一点,但这符合我的目的,让编译器帮助处理一些极其困难的调用。@jcalz是的!谢谢,我总是把它们弄混:)