typescript Assert类型A可赋值给类型B

raogr8fs  于 2023-01-31  发布在  TypeScript
关注(0)|答案(2)|浏览(169)

假设我有一个从第三方库导入的类型T1,假设类型T1定义为:

type T1 = {
    a: number | string
    b: 'b1' | 'b2' | 'b3'
    c?: boolean
}

现在我想定义类型T2如下:

type T2 = {
    a: number
    b: 'b1' | 'b2'
}

只要需要类型T1,就可以使用类型T2的对象。
在定义T2的地方,我如何显式Assert,如果不是这样的话,如何让Typescript的类型检查器抱怨?
我期待着类似下面的内容:

assert_assignable_to<T1, T2>()

我假设我可以使用OmitPick&的组合从T1构造类型T2,但是我想在代码中显式AssertT2的示例可以被赋值给T1
有什么想法吗?

a64a0gku

a64a0gku1#

您可以定义T2来扩展T1

interface T2 extends T1 {
    a: number
    b: 'b1' | 'b2'
}

如果T2不能分配给T1,您将得到错误
运动场

bgibtngc

bgibtngc2#

您可以使用通用类型。Playground

// Defined in external library
type Subtype = {
    a: number | string
    b: 'b1' | 'b2' | 'b3'
    c?: boolean
}

// Want to define internally while checking if it's a supertype
// type Supertype = {
//     a: number
//     b: 'b1' | 'b2'
// }

// Behold!
export type CreateSupertypeOf<Sub extends Super, Super> = Super;

// Fails if not a supertype
type Supertype = CreateSupertypeOf<Subtype, {
    a: number
    b: 'b1' | 'b2'
}>

注意,在这个例子中,Suptype不能赋值给Supertype,看起来你混淆了对方差的理解(阅读更多关于方差和子类型的内容)。

Type 'Subtype' does not satisfy the constraint '{ a: number; b: "b1" | "b2"; }'.
  Types of property 'a' are incompatible.
    Type 'string | number' is not assignable to type 'number'.
      Type 'string' is not assignable to type 'number'.

您可能指的是这个(Playground):

type Subtype = {
    a: number
    b: 'b1' | 'b2'
    c?: boolean
}
type Supertype = CreateSupertypeOf<Subtype, {
    a: number | string
    b: 'b1' | 'b2' | 'b3'
}>

相关问题