2

I have this properties

export interface IOurFirstSpfWebPartWebPartProps {
  description: string;
  n1: number;
  n2: number;

}

Then I have this method

public render(): void {
    this.domElement.innerHTML = `
      <div class="${styles.ourFirstSpfWebPart}">
        <div class="${styles.container}">
          <div class="ms-Grid-row ms-bgColor-themeDark ms-fontColor-white ${styles.row}">
            <div class="ms-Grid-col ms-u-lg10 ms-u-xl8 ms-u-xlPush2 ms-u-lgPush1">
              <span class="ms-font-xl ms-fontColor-white">Welcome to SharePoint!</span>
              <p class="ms-font-l ms-fontColor-white">Customize SharePoint experiences using Web Parts.</p>
              <p class="ms-font-l ms-fontColor-white">${this.properties.n1} + ${this.properties.n2}</p>
              <a href="https://github.com/SharePoint/sp-dev-docs/wiki" class="ms-Button ${styles.button}">
                <span class="ms-Button-label">Learn more</span>
              </a>
            </div>
          </div>
        </div>
      </div>`;
  }

However this is printing 1+2 instead of 3.

1
  • Because + also works as a concatenation operator and that's what seems to be done in your code.So its printing 1+2 and not 3. instead try adding your expression in curly braces it will work. Commented Sep 10, 2016 at 2:34

4 Answers 4

15

Add an extra +, for every argument which you want to add. You need to do it like: this.sum = +this.num1 + +this.num2;.

Sign up to request clarification or add additional context in comments.

1 Comment

@JohanMorales Nice to hear that. Its motivating for me
3

You answer is related to implicit coercion in javascript. Simply put, you're concatinating two strings in a template and not adding two numbers.

When you hit the {}s in your templating syntax, your numbers will be stringified. In essence you are then adding

"1" + "2" = "12"

instead of

1 + 2 = 3

You can try two things:

  1. put both expressions inside of the {}

${this.properties.n1 + this.properties.n2}

If that still makes "12" then

  1. Try ${parseInt(this.properties.n1) + parseint(this.properties.n2)}. That will coerce both values to a number first, if it can be done.

You can learn more about type coercion in the article You Don't Know JS: Types & Grammar, where it will really explain all the 'gotchas' out there about the + operator and implicit types.

Comments

2

The tick mark creates a template literal. I think you're looking for: ${this.properties.n1 + this.properties.n2}—all inside the same curly braces.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals

3 Comments

still concatenating... :(, properties are defined as numbers
I suppose you could wrap the properties in Number.parseInt(): Number.parseInt(foo) + Number.parseInt(bar)
@LuisValencia-MVP are you sure you've actually updated code - I'd recommend starting with minimal reproducible example like function f(){ var x = 3; console.log(`test ${x}+${x}=${x + x} `);}; f(); in your browser console...
1

prepend the numbers with a + sign

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.