HiveBrain v1.2.0
Get Started
← Back to all entries
patterntypescriptCritical

The property 'value' does not exist on value of type 'HTMLElement'

Submitted by: @import:stackoverflow-api··
0
Viewed 0 times
propertyexistthedoesnotvaluehtmlelementtype

Problem

I am playing around with typescript and am trying to create a script that will update a p-element as text is inputted in a input box.

The html looks as following:














And the greeter.ts file:

function greeter(person)
{
    return "Hello, " + person;
}

function greet(elementId)
{
    var inputValue = document.getElementById(elementId).value;

    if (inputValue.trim() == "")
        inputValue = "World";

    document.getElementById("greet").innerText = greeter(inputValue);
}


When I compile with tsc I get the following "error":

/home/bjarkef/sandbox/greeter.ts(8,53): The property 'value' does not exist on value of type 'HTMLElement'

However the compiler does output a javascript file, which works just fine in chrome.

How come I get this error? And how can I fix it?

Also, where can I look up which properties are valid on a 'HTMLElement' according to typescript?

Please note I am very new to javascript and typescript, so I might be missing something obvious. :)

Solution

Based on Tomasz Nurkiewiczs answer, the "problem" is that typescript is typesafe. :) So the document.getElementById() returns the type HTMLElement which does not contain a value property. The subtype HTMLInputElement does however contain the value property.

So a solution is to cast the result of getElementById() to HTMLInputElement like this:

var inputValue = (document.getElementById(elementId)).value;


<> is the casting operator in typescript. See the question TypeScript: casting HTMLElement.

If you're in a .tsx file the casting syntax above will throw an error. You'll want to use this syntax instead:

(document.getElementById(elementId) as HTMLInputElement).value


The resulting javascript from the line above looks like this:

inputValue = (document.getElementById(elementId)).value;


i.e. containing no type information.

Code Snippets

var inputValue = (<HTMLInputElement>document.getElementById(elementId)).value;
(document.getElementById(elementId) as HTMLInputElement).value
inputValue = (document.getElementById(elementId)).value;

Context

Stack Overflow Q#12989741, score: 826

Revisions (0)

No revisions yet.