繁体   English   中英

使 Typescript 从普通的 javascript 对象推断类型

[英]Make Typescript infer types from a plain javascript object

我不知道这是否可能,所以提前为这个可能很愚蠢的问题感到抱歉,但这是我的问题。

我正在创建一个库,用户可以在其中提供这样的数据库架构:

const personSchema: Schema = {
  name: 'person',
  properties: [
    { name: 'firstName', type: 'string', primary: true, required: true },
    { name: 'age', type: 'number', required: false }
  ]
}

后来,当使用库的功能之一时,我希望能够做这样的事情:

db.get(12).firstName; // no error
db.get(12).test; // compile error when in TS or (at least) no intellisense when in JS

并获得完整的智能感知。

库本身将用打字稿编写,而用户可以使用 javascript 或打字稿。 使用打字稿时,他们将能够执行诸如const personCollection = new Collection<Person>(); ,但在 Javascript 中,它们只会提供一个Schema对象。

这是可能吗? 我知道至少 VSCode 在编写 javascript 时会给出一些类型提示,但我从未见过这种“高级”的东西; 从使用字符串定义其类型的对象推断类型。

我认为没有办法从对象的属性值推断类型( get()返回类型),根据定义,该值仅在运行时存在。

我会做的是允许您的用户为其架构的属性名称创建特定的字符串文字,如下所示:

interface Schema<T> {
  name: string;
  properties: {
    name: T;
    type: "string" | "number";
    primary?: boolean;
    required: boolean;
  }[];
}
type PersonProperties = "firstName" | "lastName" | "age";

type PersonSchema = Schema<PersonProperties>;

const personSchema: PersonSchema = {
  name: "person",
  properties: [
    { name: "firstName", type: "string", primary: true, required: true },
    { name: "age", type: "number", required: false }
  ]
};

const get = function<T>(): T {
  // ...
  return null;
};

const person1 = get<PersonSchema>();
person1.properties[0].name === "firstName"; // name is infered to one of the 3 PersonProperties

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM