在TypeScript

时间:2019-06-17 10:00:16

标签: typescript

是否可以采用两种类型并确保它们具有相同的形状?例如:

// foo.json
{
    "key1": {
        "key2": "foo"
    }
}

// bar.json
{
    "key1": { 
        "key2": "bar"
    }
}

// baz.json
{
    "key1": {
        "otherkey": ""
    }
}

// main.ts

import foo from "./foo.json";
import bar from "./bar.json";
import baz from "./baz.json";

type FooType = typeof foo;
type BarType = typeof bar;
type BazType = typeof baz;

// FooType === BarType --> true
// FooType === BazType --> false

可能会做类似的事情

const f: FooType = {} as BarType;
const b: BarType = {} as FooType;

但这很丑陋,并没有真正描述正在发生的事情。

1 个答案:

答案 0 :(得分:4)

第一件事,如果您的json文件是数据,即在编译时未知,那么您无能为力-TypeScript类型仅在编译时存在。

如果要比较两种类型,则可以这样写:

type Equal<A, B> = A extends B ? B extends A ? true : false : false;

然后在某个地方:

interface A {
    s: string;
    n: number;
}

interface B {
    s: string;
}

const EQUAL_A_B: Equal<A, B> = true;

现在这将无法编译,错误为Type 'true' is not assignable to type 'false'.,因为这两种类型不相等。

相关问题