如何在TypeScript中指定类型化对象文字?

Tri*_*Gao 12 typescript

我有办法直接将类型注释应用于对象文字吗?直接我的意思是不必将其分配给注释类型的变量.例如:我知道我可以这样做:

export interface BaseInfo { value: number; }

export interface MyInfo extends BaseInfo { name: string; }

function testA(): BaseInfo = {
   const result: MyInfo = { value: 1, name: 'Hey!' };
   return result;
}
Run Code Online (Sandbox Code Playgroud)

我也可以这样做:

function testB(): BaseInfo = {
   return { value: 1, name: 'Hey!' };
}
Run Code Online (Sandbox Code Playgroud)

但我需要的是:

function testC(): BaseInfo = {
   return { value: 1, name: 'Hey!' }: MyInfo; // <--- doesn't work
}
Run Code Online (Sandbox Code Playgroud)

或者像这样:

function testD(): BaseInfo = {
   return MyInfo: { value: 1, name: 'Hey!' }; // <--- doesn't work
}
Run Code Online (Sandbox Code Playgroud)

Rya*_*ugh 16

对象文字成员的Intellisense由表达式的上下文类型(参见规范的第4.19节)提供.

您可以通过各种方式获取上下文类型.应用上下文类型的一些最常见的地方是:

  • 具有类型注释的变量的初始值设定项
  • return具有返回类型注释的函数或getter 中的语句中的表达式
  • 类型断言表达式中的表达式(<T>expr)

在您的示例中,您可以使用类型断言来强制您的对象文字具有上下文类型:

function testB() {
   return <IMyInfo>{ name: 'Hey!' };
}
Run Code Online (Sandbox Code Playgroud)

  • `&lt;IMyInfo&gt; { name: '嘿!' };` 超级不安全,考虑改变你的答案,不要传播坏习惯 (2认同)

Tri*_*Gao 11

答案是使用身份功能:

function to<T>(value: T): T { return value; }
const instance = to<MyInfo>({
    value: 1,
    name: 'Hey!',
});
Run Code Online (Sandbox Code Playgroud)

  • 这实际上生成了调用该函数的代码。是否没有[更简单的方法来检查对象文字的类型](/sf/ask/4277482261/​​-typescript)? (2认同)
  • 我认为 @DanDascalescu 意味着该函数实际上会在创建对象文字时在运行时调用。正如您所提到的,这可能完全可以忽略不计(由于可能的 JIT 优化或简单地只创建了几次文字),但仍然感觉不是最佳的。 (2认同)