如何将对象属性定义为功能=正确的语法?

时间:2019-10-15 08:58:07

标签: typescript function types

有人可以指出规范的确切位置以了解第testMessage: (): string => {行的语法吗?语法不应该像testMessage: () => string;一样吗?他们为什么不同?

export default {
  Query: {
    testMessage: (): string => {
      return 'Hello World!';
    }
  }
};

1 个答案:

答案 0 :(得分:1)

这有点令人困惑,因为您的:在同一行中具有两个不同的功能:第一个是JavaScript的字典分配,第二个是来自TypeScript的类型信息。

let someMessageWithoutReturnType = () => { return 'Hello World!'; }
//                                 ^-- lambda function -----------^

let someMessage =                  (): string => { return 'Hello World!'; }
//                                   ^-type-^
//                                 ^-- lambda function -------------------^

在上述每种方法中,变量没有类型信息。相反,lambda函数具有可选的类型信息(显式返回类型),例如standard function syntax in this example in the Functions page of the handbook

function add(x: number, y: number): number {
   return x + y;
}

let myAdd = function(x: number, y: number): number { return x + y; };

如果您在字典中进行分配,则此行为仍然相同,但是第一个:在分配中代替了=,而第二个:将返回类型信息提供给函数表达式。这里的含义很明确,因为您不能使用冒号在字典中明确键入键someMessage;您需要显式强制转换。

let someMessageDict = {
  someMessage: (): string => { return 'Hello World!'; }
//             ^-- lambda function -------------------^
};

相反,您提到的语法用于键入变量,如"Writing the function type"部分中所述。请注意,这一次,变量是显式键入的,但未设置为任何值。没有实现。

let testMessage: () => string;

class SomeClass {
  testMessage:  () => string;  // defines an unset field
  testMessage2: () => string = SOME_FUNCTION_DECLARED_ELSEWHERE;
  testMessage3: () => string = (): string => { /* ... */ };
}

类定义说明了在哪里可能造成混淆::引用类型信息,而=将设置初始值。也就是说,同样的逻辑也适用:使用=>来描述类型表达式中的返回类型,并使用:来对内联函数定义(其本身可能使用=>语法进行注释)。返回类型。