Какова лучшая практика для получения одного типа от типа объединения - PullRequest
0 голосов
/ 01 октября 2019

У меня есть такой код

interface MyInterface {
  name: string;
}

type MyType = string | MyInterface;

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {

  constructor() {
    console.log(this.getValueAsString('Hello World'));
    console.log(this.getValueAsString({name: 'Hello World'}));
  }

  // I want to return 'Hello World' for both possible types
  getValueAsString(myValue: MyType): string {
    // not working because compiler says name is no property of string
    // return myValue.name ? myValue.name : myValue;
  }
}

Проблема в том, что при каждом попытке я пытался, чтобы компилятор всегда появлялся, потому что что-то не подходит ни для одного из типов.

Какое будет лучшее решение для getValueAsString?

(стек-блиц: https://stackblitz.com/edit/angular-jrty3q)

1 Ответ

1 голос
/ 01 октября 2019

Для этого вы используете type guard :

getValueAsString(myValue: MyType): string {
  return typeof myValue === "string" ? myValue : myValue.name;
}

В приведенном выше примере, поскольку компилятор TypeScript знает, что myValue будет либо string, либо MyInterface,typeof myValue === "string" охранник сообщает, что в истинной части условного (после ?) myValue - строка, а в ложной части (после :) - MyInterface.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...