首页 > 解决方案 > 在 Typescript 的对象文字中指定值的类型?

问题描述

这是一个与TypeScript in object literal 中的类型定义不同的问题

我有一个接受任何对象作为其属性之一的接口:

interface MyType {
  /* ... */
  options: any;
}

虽然属性options可以是任何东西,但有时我想指定某些类型。我不想使用“as”关键字,因为我不想强制它(如果我缺少属性,我想看到错误)。

这是我可以做到的一种方法:

interface MyTypeOptions {
  hasName: boolean;
  hasValue: boolean;
}

// Declare the options separately just so we can specify a type
const options: MyTypeOptions = {
  hasName: false,
  hasValue: true
};

const myType: MyType = {
  /* ... */
  options
}

但是有没有办法在myType不使用类型断言的情况下将选项内联在对象文字中?换句话说,我想这样做:

const myType: MyType = {
  /* ... */
  // I want to type-check that the following value is of type MyTypeOptions
  options: {
    hasName: false,
    hasValue: true
  } 
}

标签: typescript

解决方案


您正在寻找仿制药。您可以使MyType泛型并指定MyTypeOptions为类型参数MyType

interface MyTypeOptions {
    hasName: boolean;
    hasValue: boolean;
}

// Declare the options separately just so we can specify a type
const options: MyTypeOptions = {
    hasName: false,
    hasValue: true
}

// We specify any as the default to T so we can also use MyType without a type parameter
interface MyType<T = any> {
    /* ... */
    options: T;
}
const myType: MyType<MyTypeOptions> = {
    options: {
        hasName: false,
        hasValue: true
    }
}

推荐阅读