{"action":"created","comment":{"url":"https://api.github.com/repos/Microsoft/TypeScript/pulls/comments/86897979","pull_request_review_id":7526118,"id":86897979,"diff_hunk":"@@ -11069,66 +11127,145 @@ namespace ts {\n             }\r\n         }\r\n \r\n-        function checkJsxAttribute(node: JsxAttribute, elementAttributesType: Type, nameTable: Map<boolean>) {\r\n-            let correspondingPropType: Type = undefined;\r\n-\r\n-            // Look up the corresponding property for this attribute\r\n-            if (elementAttributesType === emptyObjectType && isUnhyphenatedJsxName(node.name.text)) {\r\n-                // If there is no 'props' property, you may not have non-\"data-\" attributes\r\n-                error(node.parent, Diagnostics.JSX_element_class_does_not_support_attributes_because_it_does_not_have_a_0_property, getJsxElementPropertiesName());\r\n-            }\r\n-            else if (elementAttributesType && !isTypeAny(elementAttributesType)) {\r\n-                const correspondingPropSymbol = getPropertyOfType(elementAttributesType, node.name.text);\r\n-                correspondingPropType = correspondingPropSymbol && getTypeOfSymbol(correspondingPropSymbol);\r\n-                if (isUnhyphenatedJsxName(node.name.text)) {\r\n-                    const attributeType = getTypeOfPropertyOfType(elementAttributesType, getTextOfPropertyName(node.name)) || getIndexTypeOfType(elementAttributesType, IndexKind.String);\r\n-                    if (attributeType) {\r\n-                        correspondingPropType = attributeType;\r\n+        /**\r\n+         * Get attributes symbol of the given Jsx opening-like element. The result is from resolving \"attributes\" property of the opening-like element.\r\n+         * @param openingLikeElement a Jsx opening-like element\r\n+         * @return a symbol table resulted from resolving \"attributes\" property or undefined if any of the attribute resolved to any or there is no attributes.\r\n+         */\r\n+        function getJsxAttributesSymbolArrayFromAttributesProperty(openingLikeElement: JsxOpeningLikeElement): Symbol[] | undefined {\r\n+            const attributes = openingLikeElement.attributes;\r\n+            let attributesTable = createMap<Symbol>();\r\n+            let spread: Type = emptyObjectType\r\n+            let attributesArray: Symbol[] = [];\r\n+            for (const attributeDecl of attributes.properties) {\r\n+                const member = attributeDecl.symbol;\r\n+                if (isJsxAttribute(attributeDecl)) {\r\n+                    let exprType: Type;\r\n+                    if (attributeDecl.initializer) {\r\n+                        exprType = checkExpression(attributeDecl.initializer);\r\n                     }\r\n                     else {\r\n-                        // If there's no corresponding property with this name, error\r\n-                        if (!correspondingPropType) {\r\n-                            error(node.name, Diagnostics.Property_0_does_not_exist_on_type_1, node.name.text, typeToString(elementAttributesType));\r\n-                            return unknownType;\r\n-                        }\r\n+                        // <Elem attr /> is sugar for <Elem attr={true} />\r\n+                        exprType = trueType;\r\n+                    }\r\n+\r\n+                    const attributeSymbol = <TransientSymbol>createSymbol(SymbolFlags.Property | SymbolFlags.Transient | member.flags, member.name);\r\n+                    attributeSymbol.declarations = member.declarations;\r\n+                    attributeSymbol.parent = member.parent;\r\n+                    if (member.valueDeclaration) {\r\n+                        attributeSymbol.valueDeclaration = member.valueDeclaration;\r\n                     }\r\n+                    attributeSymbol.type = exprType;\r\n+                    attributeSymbol.target = member;\r\n+                    attributesTable[attributeSymbol.name] = attributeSymbol;\r\n+                    attributesArray.push(attributeSymbol);\r\n+                }\r\n+                else {\r\n+                    Debug.assert(attributeDecl.kind === SyntaxKind.JsxSpreadAttribute);\r\n+                    if (attributesArray.length > 0) {\r\n+                        spread = getSpreadType(spread, createJsxAttributesType(attributes.symbol, attributesTable), attributes.symbol);\r\n+                        attributesArray = [];\r\n+                        attributesTable = createMap<Symbol>();\r\n+                    }\r\n+                    const exprType = checkExpression(attributeDecl.expression);\r\n+                    const widenExprType = getWidenedType(exprType);\r\n+                    if (!(widenExprType.flags & (TypeFlags.Object | TypeFlags.Any))) {\r\n+                        error(attributeDecl, Diagnostics.Spread_types_may_only_be_created_from_object_types);\r\n+                        return undefined;\r\n+                    }\r\n+                    if (isTypeAny(widenExprType)) {\r\n+                        return undefined;\r\n+                    }\r\n+                    spread = getSpreadType(spread, exprType, attributes.symbol);\r\n                 }\r\n             }\r\n \r\n-            let exprType: Type;\r\n-            if (node.initializer) {\r\n-                exprType = checkExpression(node.initializer);\r\n-            }\r\n-            else {\r\n-                // <Elem attr /> is sugar for <Elem attr={true} />\r\n-                exprType = booleanType;\r\n+            if (spread !== emptyObjectType) {\r\n+                if (attributesArray.length > 0) {\r\n+                    spread = getSpreadType(spread, createJsxAttributesType(attributes.symbol, attributesTable), attributes.symbol);\r\n+                    attributesArray = [];\r\n+                    attributesTable = createMap<Symbol>();\r\n+                }\r\n+                attributesArray = getPropertiesOfType(spread);\r\n             }\r\n \r\n-            if (correspondingPropType) {\r\n-                checkTypeAssignableTo(exprType, correspondingPropType, node);\r\n-            }\r\n+            return attributesArray;\r\n+        }\r\n \r\n-            nameTable[node.name.text] = true;\r\n-            return exprType;\r\n+        /**\r\n+         * Create anonymous type from given attributes symbol table.\r\n+         * @param jsxAttributesSymb a JsxAttributes node containing attributes in attributesTable\r\n+         * @param attributesTable a symbol table of attributes property\r\n+         */\r\n+        function createJsxAttributesType(jsxAttributesSymb: Symbol, attributesTable: Map<Symbol>) {\r\n+            const result = createAnonymousType(jsxAttributesSymb, attributesTable, emptyArray, emptyArray, /*stringIndexInfo*/ undefined, /*numberIndexInfo*/ undefined);\r\n+            const freshObjectLiteralFlag = compilerOptions.suppressExcessPropertyErrors ? 0 : TypeFlags.FreshLiteral;\r\n+            result.flags |= TypeFlags.JsxAttributes | TypeFlags.ContainsObjectLiteral | freshObjectLiteralFlag;\r\n+            result.objectFlags |= ObjectFlags.ObjectLiteral;\r\n+            return result;\r\n         }\r\n \r\n-        function checkJsxSpreadAttribute(node: JsxSpreadAttribute, elementAttributesType: Type, nameTable: Map<boolean>) {\r\n-            const type = checkExpression(node.expression);\r\n-            const props = getPropertiesOfType(type);\r\n-            for (const prop of props) {\r\n-                // Is there a corresponding property in the element attributes type? Skip checking of properties\r\n-                // that have already been assigned to, as these are not actually pushed into the resulting type\r\n-                if (!nameTable[prop.name]) {\r\n-                    const targetPropSym = getPropertyOfType(elementAttributesType, prop.name);\r\n-                    if (targetPropSym) {\r\n-                        const msg = chainDiagnosticMessages(undefined, Diagnostics.Property_0_of_JSX_spread_attribute_is_not_assignable_to_target_property, prop.name);\r\n-                        checkTypeAssignableTo(getTypeOfSymbol(prop), getTypeOfSymbol(targetPropSym), node, undefined, msg);\r\n+        /**\r\n+         * Check JSXAttributes. This function is used when we are trying to figure out call signature for JSX opening-like element.\r\n+         * In \"checkApplicableSignatureForJsxOpeningLikeElement\", we get type of arguments by checking the JSX opening-like element attributes property with contextual type.\r\n+         * @param node a JSXAttributes to be resolved of its typea\r\n+         */\r\n+        function checkJsxAttributes(node: JsxAttributes) {\r\n+            const symbolArray = getJsxAttributesSymbolArrayFromAttributesProperty(node.parent as JsxOpeningLikeElement);\r\n+            let argAttributesType = anyType as Type;\r\n+            if (symbolArray) {\r\n+                const symbolTable = createMap<Symbol>();\r\n+                forEach(symbolArray, (attr) => {\r\n+                    symbolTable[attr.name] = attr;\r","path":"src/compiler/checker.ts","position":338,"original_position":338,"commit_id":"3f32fa1df57d4f99505d74f4e5252b279cc72f25","original_commit_id":"3f32fa1df57d4f99505d74f4e5252b279cc72f25","user":{"login":"sandersn","id":293473,"avatar_url":"https://avatars.githubusercontent.com/u/293473?v=3","gravatar_id":"","url":"https://api.github.com/users/sandersn","html_url":"https://github.com/sandersn","followers_url":"https://api.github.com/users/sandersn/followers","following_url":"https://api.github.com/users/sandersn/following{/other_user}","gists_url":"https://api.github.com/users/sandersn/gists{/gist_id}","starred_url":"https://api.github.com/users/sandersn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sandersn/subscriptions","organizations_url":"https://api.github.com/users/sandersn/orgs","repos_url":"https://api.github.com/users/sandersn/repos","events_url":"https://api.github.com/users/sandersn/events{/privacy}","received_events_url":"https://api.github.com/users/sandersn/received_events","type":"User","site_admin":false},"body":"what about hyphenated names? The other caller handles hyphenated names differently.","created_at":"2016-11-08T00:02:59Z","updated_at":"2016-11-08T00:30:28Z","html_url":"https://github.com/Microsoft/TypeScript/pull/11871#discussion_r86897979","pull_request_url":"https://api.github.com/repos/Microsoft/TypeScript/pulls/11871","_links":{"self":{"href":"https://api.github.com/repos/Microsoft/TypeScript/pulls/comments/86897979"},"html":{"href":"https://github.com/Microsoft/TypeScript/pull/11871#discussion_r86897979"},"pull_request":{"href":"https://api.github.com/repos/Microsoft/TypeScript/pulls/11871"}}},"pull_request":{"url":"https://api.github.com/repos/Microsoft/TypeScript/pulls/11871","id":91098407,"html_url":"https://github.com/Microsoft/TypeScript/pull/11871","diff_url":"https://github.com/Microsoft/TypeScript/pull/11871.diff","patch_url":"https://github.com/Microsoft/TypeScript/pull/11871.patch","issue_url":"https://api.github.com/repos/Microsoft/TypeScript/issues/11871","number":11871,"state":"open","locked":false,"title":"[WIP] Using overload for JSX stateless function component","user":{"login":"yuit","id":489742,"avatar_url":"https://avatars.githubusercontent.com/u/489742?v=3","gravatar_id":"","url":"https://api.github.com/users/yuit","html_url":"https://github.com/yuit","followers_url":"https://api.github.com/users/yuit/followers","following_url":"https://api.github.com/users/yuit/following{/other_user}","gists_url":"https://api.github.com/users/yuit/gists{/gist_id}","starred_url":"https://api.github.com/users/yuit/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yuit/subscriptions","organizations_url":"https://api.github.com/users/yuit/orgs","repos_url":"https://api.github.com/users/yuit/repos","events_url":"https://api.github.com/users/yuit/events{/privacy}","received_events_url":"https://api.github.com/users/yuit/received_events","type":"User","site_admin":false},"body":"This PR is still WIP. Some clean up will be needed. It is branch off from @sandersn PR on spread operator. \r\n\r\nFix: #11187 (see this test: tsxSpreadAttributesResolution1), #9703\r\n\r\n**Overview of the change**\r\n- Treat `JSXAttributes` similar to `ObjectLiteralExpression`. We change the AST structure and store JSXAttributes as a AST Node instead of NodeArray\r\n- Using overload resolution logic in choosing signature of stateless function component\r\n- This change rely on @sandersn spread operator to resolve the attributs\r\n\r\n**Todo**\r\n- [ ] - Handle of spreading with any\r\n\r\nCurrently when we see spread of any type, the entire attributes has any type which means that follow example is allowed even though we should give an error:\r\n\r\n``` typescript\r\ndeclare function MainBuntton(attr1: {to: string}): JSX.Element;\r\ndeclare function MainBuntton(attr2: {onClick: ()=> void}): JSX.Element;\r\ndeclare var obj3: any;\r\nconst b = <MainBuntton {...obj3} to={10} />;\r\n```\r\n- [x] Add tests for quick-info, goto-definition, completion to make sure that we reflect the choosen overload\r\n- [x] Add tests when using stateless with type arguments.\r\n\r\n@RyanCavanaugh @mhegazy \r\n","created_at":"2016-10-26T22:08:52Z","updated_at":"2016-11-08T00:30:28Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5939d15fcec822dab1ef979cfaf460c6528d4ffa","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/Microsoft/TypeScript/pulls/11871/commits","review_comments_url":"https://api.github.com/repos/Microsoft/TypeScript/pulls/11871/comments","review_comment_url":"https://api.github.com/repos/Microsoft/TypeScript/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Microsoft/TypeScript/issues/11871/comments","statuses_url":"https://api.github.com/repos/Microsoft/TypeScript/statuses/3f32fa1df57d4f99505d74f4e5252b279cc72f25","head":{"label":"Microsoft:wip-statelessOverload","ref":"wip-statelessOverload","sha":"3f32fa1df57d4f99505d74f4e5252b279cc72f25","user":{"login":"Microsoft","id":6154722,"avatar_url":"https://avatars.githubusercontent.com/u/6154722?v=3","gravatar_id":"","url":"https://api.github.com/users/Microsoft","html_url":"https://github.com/Microsoft","followers_url":"https://api.github.com/users/Microsoft/followers","following_url":"https://api.github.com/users/Microsoft/following{/other_user}","gists_url":"https://api.github.com/users/Microsoft/gists{/gist_id}","starred_url":"https://api.github.com/users/Microsoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Microsoft/subscriptions","organizations_url":"https://api.github.com/users/Microsoft/orgs","repos_url":"https://api.github.com/users/Microsoft/repos","events_url":"https://api.github.com/users/Microsoft/events{/privacy}","received_events_url":"https://api.github.com/users/Microsoft/received_events","type":"Organization","site_admin":false},"repo":{"id":20929025,"name":"TypeScript","full_name":"Microsoft/TypeScript","owner":{"login":"Microsoft","id":6154722,"avatar_url":"https://avatars.githubusercontent.com/u/6154722?v=3","gravatar_id":"","url":"https://api.github.com/users/Microsoft","html_url":"https://github.com/Microsoft","followers_url":"https://api.github.com/users/Microsoft/followers","following_url":"https://api.github.com/users/Microsoft/following{/other_user}","gists_url":"https://api.github.com/users/Microsoft/gists{/gist_id}","starred_url":"https://api.github.com/users/Microsoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Microsoft/subscriptions","organizations_url":"https://api.github.com/users/Microsoft/orgs","repos_url":"https://api.github.com/users/Microsoft/repos","events_url":"https://api.github.com/users/Microsoft/events{/privacy}","received_events_url":"https://api.github.com/users/Microsoft/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Microsoft/TypeScript","description":"TypeScript is a superset of JavaScript that compiles to clean JavaScript output.","fork":false,"url":"https://api.github.com/repos/Microsoft/TypeScript","forks_url":"https://api.github.com/repos/Microsoft/TypeScript/forks","keys_url":"https://api.github.com/repos/Microsoft/TypeScript/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Microsoft/TypeScript/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Microsoft/TypeScript/teams","hooks_url":"https://api.github.com/repos/Microsoft/TypeScript/hooks","issue_events_url":"https://api.github.com/repos/Microsoft/TypeScript/issues/events{/number}","events_url":"https://api.github.com/repos/Microsoft/TypeScript/events","assignees_url":"https://api.github.com/repos/Microsoft/TypeScript/assignees{/user}","branches_url":"https://api.github.com/repos/Microsoft/TypeScript/branches{/branch}","tags_url":"https://api.github.com/repos/Microsoft/TypeScript/tags","blobs_url":"https://api.github.com/repos/Microsoft/TypeScript/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Microsoft/TypeScript/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Microsoft/TypeScript/git/refs{/sha}","trees_url":"https://api.github.com/repos/Microsoft/TypeScript/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Microsoft/TypeScript/statuses/{sha}","languages_url":"https://api.github.com/repos/Microsoft/TypeScript/languages","stargazers_url":"https://api.github.com/repos/Microsoft/TypeScript/stargazers","contributors_url":"https://api.github.com/repos/Microsoft/TypeScript/contributors","subscribers_url":"https://api.github.com/repos/Microsoft/TypeScript/subscribers","subscription_url":"https://api.github.com/repos/Microsoft/TypeScript/subscription","commits_url":"https://api.github.com/repos/Microsoft/TypeScript/commits{/sha}","git_commits_url":"https://api.github.com/repos/Microsoft/TypeScript/git/commits{/sha}","comments_url":"https://api.github.com/repos/Microsoft/TypeScript/comments{/number}","issue_comment_url":"https://api.github.com/repos/Microsoft/TypeScript/issues/comments{/number}","contents_url":"https://api.github.com/repos/Microsoft/TypeScript/contents/{+path}","compare_url":"https://api.github.com/repos/Microsoft/TypeScript/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Microsoft/TypeScript/merges","archive_url":"https://api.github.com/repos/Microsoft/TypeScript/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Microsoft/TypeScript/downloads","issues_url":"https://api.github.com/repos/Microsoft/TypeScript/issues{/number}","pulls_url":"https://api.github.com/repos/Microsoft/TypeScript/pulls{/number}","milestones_url":"https://api.github.com/repos/Microsoft/TypeScript/milestones{/number}","notifications_url":"https://api.github.com/repos/Microsoft/TypeScript/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Microsoft/TypeScript/labels{/name}","releases_url":"https://api.github.com/repos/Microsoft/TypeScript/releases{/id}","deployments_url":"https://api.github.com/repos/Microsoft/TypeScript/deployments","created_at":"2014-06-17T15:28:39Z","updated_at":"2016-11-07T23:28:13Z","pushed_at":"2016-11-08T00:05:32Z","git_url":"git://github.com/Microsoft/TypeScript.git","ssh_url":"git@github.com:Microsoft/TypeScript.git","clone_url":"https://github.com/Microsoft/TypeScript.git","svn_url":"https://github.com/Microsoft/TypeScript","homepage":"http://www.typescriptlang.org","size":600931,"stargazers_count":16506,"watchers_count":16506,"language":"TypeScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":2259,"mirror_url":null,"open_issues_count":1525,"forks":2259,"open_issues":1525,"watchers":16506,"default_branch":"master"}},"base":{"label":"Microsoft:object-spread","ref":"object-spread","sha":"6a82ae4cbb209d6f3fdad74cdf6146747ed33449","user":{"login":"Microsoft","id":6154722,"avatar_url":"https://avatars.githubusercontent.com/u/6154722?v=3","gravatar_id":"","url":"https://api.github.com/users/Microsoft","html_url":"https://github.com/Microsoft","followers_url":"https://api.github.com/users/Microsoft/followers","following_url":"https://api.github.com/users/Microsoft/following{/other_user}","gists_url":"https://api.github.com/users/Microsoft/gists{/gist_id}","starred_url":"https://api.github.com/users/Microsoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Microsoft/subscriptions","organizations_url":"https://api.github.com/users/Microsoft/orgs","repos_url":"https://api.github.com/users/Microsoft/repos","events_url":"https://api.github.com/users/Microsoft/events{/privacy}","received_events_url":"https://api.github.com/users/Microsoft/received_events","type":"Organization","site_admin":false},"repo":{"id":20929025,"name":"TypeScript","full_name":"Microsoft/TypeScript","owner":{"login":"Microsoft","id":6154722,"avatar_url":"https://avatars.githubusercontent.com/u/6154722?v=3","gravatar_id":"","url":"https://api.github.com/users/Microsoft","html_url":"https://github.com/Microsoft","followers_url":"https://api.github.com/users/Microsoft/followers","following_url":"https://api.github.com/users/Microsoft/following{/other_user}","gists_url":"https://api.github.com/users/Microsoft/gists{/gist_id}","starred_url":"https://api.github.com/users/Microsoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Microsoft/subscriptions","organizations_url":"https://api.github.com/users/Microsoft/orgs","repos_url":"https://api.github.com/users/Microsoft/repos","events_url":"https://api.github.com/users/Microsoft/events{/privacy}","received_events_url":"https://api.github.com/users/Microsoft/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Microsoft/TypeScript","description":"TypeScript is a superset of JavaScript that compiles to clean JavaScript output.","fork":false,"url":"https://api.github.com/repos/Microsoft/TypeScript","forks_url":"https://api.github.com/repos/Microsoft/TypeScript/forks","keys_url":"https://api.github.com/repos/Microsoft/TypeScript/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Microsoft/TypeScript/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Microsoft/TypeScript/teams","hooks_url":"https://api.github.com/repos/Microsoft/TypeScript/hooks","issue_events_url":"https://api.github.com/repos/Microsoft/TypeScript/issues/events{/number}","events_url":"https://api.github.com/repos/Microsoft/TypeScript/events","assignees_url":"https://api.github.com/repos/Microsoft/TypeScript/assignees{/user}","branches_url":"https://api.github.com/repos/Microsoft/TypeScript/branches{/branch}","tags_url":"https://api.github.com/repos/Microsoft/TypeScript/tags","blobs_url":"https://api.github.com/repos/Microsoft/TypeScript/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Microsoft/TypeScript/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Microsoft/TypeScript/git/refs{/sha}","trees_url":"https://api.github.com/repos/Microsoft/TypeScript/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Microsoft/TypeScript/statuses/{sha}","languages_url":"https://api.github.com/repos/Microsoft/TypeScript/languages","stargazers_url":"https://api.github.com/repos/Microsoft/TypeScript/stargazers","contributors_url":"https://api.github.com/repos/Microsoft/TypeScript/contributors","subscribers_url":"https://api.github.com/repos/Microsoft/TypeScript/subscribers","subscription_url":"https://api.github.com/repos/Microsoft/TypeScript/subscription","commits_url":"https://api.github.com/repos/Microsoft/TypeScript/commits{/sha}","git_commits_url":"https://api.github.com/repos/Microsoft/TypeScript/git/commits{/sha}","comments_url":"https://api.github.com/repos/Microsoft/TypeScript/comments{/number}","issue_comment_url":"https://api.github.com/repos/Microsoft/TypeScript/issues/comments{/number}","contents_url":"https://api.github.com/repos/Microsoft/TypeScript/contents/{+path}","compare_url":"https://api.github.com/repos/Microsoft/TypeScript/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Microsoft/TypeScript/merges","archive_url":"https://api.github.com/repos/Microsoft/TypeScript/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Microsoft/TypeScript/downloads","issues_url":"https://api.github.com/repos/Microsoft/TypeScript/issues{/number}","pulls_url":"https://api.github.com/repos/Microsoft/TypeScript/pulls{/number}","milestones_url":"https://api.github.com/repos/Microsoft/TypeScript/milestones{/number}","notifications_url":"https://api.github.com/repos/Microsoft/TypeScript/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Microsoft/TypeScript/labels{/name}","releases_url":"https://api.github.com/repos/Microsoft/TypeScript/releases{/id}","deployments_url":"https://api.github.com/repos/Microsoft/TypeScript/deployments","created_at":"2014-06-17T15:28:39Z","updated_at":"2016-11-07T23:28:13Z","pushed_at":"2016-11-08T00:05:32Z","git_url":"git://github.com/Microsoft/TypeScript.git","ssh_url":"git@github.com:Microsoft/TypeScript.git","clone_url":"https://github.com/Microsoft/TypeScript.git","svn_url":"https://github.com/Microsoft/TypeScript","homepage":"http://www.typescriptlang.org","size":600931,"stargazers_count":16506,"watchers_count":16506,"language":"TypeScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":2259,"mirror_url":null,"open_issues_count":1525,"forks":2259,"open_issues":1525,"watchers":16506,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Microsoft/TypeScript/pulls/11871"},"html":{"href":"https://github.com/Microsoft/TypeScript/pull/11871"},"issue":{"href":"https://api.github.com/repos/Microsoft/TypeScript/issues/11871"},"comments":{"href":"https://api.github.com/repos/Microsoft/TypeScript/issues/11871/comments"},"review_comments":{"href":"https://api.github.com/repos/Microsoft/TypeScript/pulls/11871/comments"},"review_comment":{"href":"https://api.github.com/repos/Microsoft/TypeScript/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Microsoft/TypeScript/pulls/11871/commits"},"statuses":{"href":"https://api.github.com/repos/Microsoft/TypeScript/statuses/3f32fa1df57d4f99505d74f4e5252b279cc72f25"}}}}
{"actor":{"display_login":"sandersn"}}