当前位置: 首页 > 知识库问答 >
问题:

如何就地声明对象的属性类型,而不需要声明整个对象的类型?

漆雕安晏
2023-03-14

在编写对象时,有没有方法键入对象的属性?与预先定义类型/接口相反。

我唯一能想到的是作为,但这太宽松了。考虑一下:

type Comment = Required<{
    author: string;
    message: string;
}>;

const myComment: Comment = {
    author: 'Steve',
    // Error! :) 'message' is missing
};

const myData = {
    myComment: {
        author: 'Steve',
        // No error. :(
    } as Comment,
};

const myData = {
    myComment: <Comment>{
        author: 'Steve',
        // No error. :(
    },
};

我想要<code>myData。myComment</code>抛出相同的错误。

这当然是一个微不足道的例子。但是如果我正在写一个大的复杂的对象,能够动态地声明它的部分类型会很好。

共有3个答案

狄令
2023-03-14

一种选择是使用 IIFE,尽管它很丑陋并且具有(非常)轻微的性能影响:

const myData = {
    myComment: ((): Comment => ({
        author: 'Steve',
        // Error! 'message' is missing
    }))(),
};
郎灿
2023-03-14

注意:Commentlib.dom.d.ts中的内置类型。如果您将该标识符与om库一起使用,您将收到以下错误:

重复的标识符“注释”。(2300)

您可以使用标识函数来确保输入可分配给参数类型:

TS游乐场

type C = {
  author: string;
  message: string;
};

/** If you use this, you MUST provide the generic type argument to constrian your value */
function id <T>(value: T): T {
  return value;
}

const number1 = id<number>('hello'); /*
                           ^^^^^^^
Argument of type 'string' is not assignable to parameter of type 'number'.(2345)
*/

// Don't forget to supply the generic type argument!
const number2 = id('hello'); // typeof value2 === "hello"

const myData1 = {
  myComment: id<C>({
    author: 'Steve',
    // message: 'Hi',
  }), /*
^^^^^^^^^^^^^^^^^^^^^^^^^
Argument of type '{ author: string; }' is not assignable to parameter of type 'C'.
  Property 'message' is missing in type '{ author: string; }' but required in type 'C'.(2345) */
};

const myData2 = {
  myComment: id<C>({
    author: 'Alex',
    message: 'Hello',
  }), // ok
};

console.log(myData1); // { myComment: { author: 'Steve' } }
console.log(myData2); // { myComment: { author: 'Alex', message: 'Hello' } }

或者,如果您只是想避免键入,您可以在想要包含注释的对象之前定义注释,如下所示:

TS游乐场

type C = {
  author: string;
  message: string;
};

let myComment: C = {
  author: 'Steve',
  message: 'Hi',
};

const myData1 = { myComment };

myComment = {
  author: 'Alex',
  message: 'Hello',
};

const myData2 = { myComment };

console.log(myData1); // { myComment: { author: 'Steve', message: 'Hi' } }
console.log(myData2); // { myComment: { author: 'Alex', message: 'Hello' } }
console.log(myComment); // { author: 'Alex', message: 'Hello' }
居晗日
2023-03-14

匿名/内联接口会起作用吗?你仍然需要它放在对象之前,但它比接口/类型更简洁:

const myData: { myComment: Comment } = {
  myComment: {
    author: 'Steve',
    // error
  },
};
 类似资料:
  • 今天,我意识到让数组像字典一样运行更有意义,这样我就可以通过名称而不是数字索引访问特定元素。我希望能够执行而不是(即使我声明了一个将submitButton映射到请求的索引的枚举)。 这是可行的,但我现在允许一堆欺骗我的代码库,这是很糟糕的。我希望对象知道,只有类型的东西才能放入其中。 我可以用这些字段声明一个类,因为我希望它们的数量在将来可以动态添加,所以下面的操作是不可行的。

  • 本文向大家介绍如何使用JSP声明来声明类的对象?,包括了如何使用JSP声明来声明类的对象?的使用技巧和注意事项,需要的朋友参考一下 声明声明了一个或多个变量或方法,您可以稍后在JSP文件中的Java代码中使用它们。在JSP文件中使用变量或方法之前,必须先声明该变量或方法。 以下是JSP声明的语法- 您可以编写与上述语法等效的XML,如下所示- 以下是JSP声明中对象声明的示例-

  • 问题内容: 如何将类属性声明为对象? 我试过了: 但这没有用。另外,为什么要那样做呢? 只实例化该对象并使用其成员不是更好吗? 问题答案: 从有关类属性的PHP手册(重点是我的): 类成员变量称为“属性”。您可能还会看到使用其他术语(例如“属性”或“字段”)来引用它们,但是出于参考目的,我们将使用“属性”。它们是使用关键字public,protected或private之一定义的,后跟普通变量声明

  • 我查看了许多示例代码和文档,无论是隐式构造函数还是显式构造函数,您都可以通过使用类名前面的来声明新类,但随后它们会声明一些值。因此,我认为在某个外部作用域声明它之前,实例是不存在的。

  • 问题内容: 我已经有一段时间没有接触过Mockito了,我也从未广泛使用它。但是今天,在一些新代码中,我想使用最佳实践,因此我使用以下Java版本退出了模仿内核2.0.54-beta: 我需要此接口的实例进行测试: https://bitbucket.org/globalmentor/rincl/src/bf0e8875a1bae16247dd904e0b8bc067c9f8abc9/src/ma

  • 我有一段时间没有接触过Mockito,也从来没有大量使用过它。但是今天在一些新代码中,我希望使用最佳实践,所以我使用以下Java版本推出了mockito-core 2.0.54-beta: 要重现此问题,请克隆https://bitbucket.org/globalmentor/rincl.git并签出commit2f88d7c5e5ac17b6d316ed54c12cb7b447b7d6ac。然