code: function getEffectiveDecoratorThirdArgumentType(node) {
              // The third argument to a decorator is either its `descriptor` for a method decorator
              // or its `parameterIndex` for a parameter decorator
              if (node.kind === 221 /* ClassDeclaration */) {
                  ts.Debug.fail("Class decorators should not have a third synthetic argument.");
                  return unknownType;
              }
              if (node.kind === 142 /* Parameter */) {
                  // The `parameterIndex` for a parameter decorator is always a number
                  return numberType;
              }
              if (node.kind === 145 /* PropertyDeclaration */) {
                  ts.Debug.fail("Property decorators should not have a third synthetic argument.");
                  return unknownType;
              }
              if (node.kind === 147 /* MethodDeclaration */ ||
                  node.kind === 149 /* GetAccessor */ ||
                  node.kind === 150 /* SetAccessor */) {
                  // The `descriptor` for a method decorator will be a `TypedPropertyDescriptor<T>`
                  // for the type of the member.
                  var propertyType = getTypeOfNode(node);
                  return createTypedPropertyDescriptorType(propertyType);
              }
              ts.Debug.fail("Unsupported decorator target.");
              return unknownType;
          }
docs: Returns the effective argument type for the third argument to a decorator.
  If 'node' is a parameter, the effective argument type is the number type.
  If 'node' is a method or accessor, the effective argument type is a
  `TypedPropertyDescriptor<T>` instantiated with the type of the member.
  Class and property decorators do not have a third effective argument.