Причина, по которой тип объединения не позволяет искать свойства - PullRequest
0 голосов
/ 25 июня 2018

Это долго меня озадачивало:

enter image description here

В основном ситуация такова:

interface NLUAddOpts{}
interface NLURunOpts{
  treeify: boolean
}

const fn = function(opts: NLUAddOpts | NLURunOpts){
  if(opts.treeify){  // compilation error

  }
}

Почему !? Если вы просто читаете свойство, но не его свойство, то не должно ли оно просто скомпилироваться? По крайней мере, он должен скомпилироваться, если он в проверке if.

С другой стороны, если это было задание:

const treeify = opts.treeify;

Думаю, я понял, почему он не скомпилируется.

Как лучше всего решить этот вопрос?

1 Ответ

0 голосов
/ 25 июня 2018

Ответ довольно прост, вы заявили, что opts имеет тип NLUAddOpts ИЛИ NLURunOpts.Это означает, что вы можете получить доступ только к свойствам, которые являются общими для обоих типов, иначе TS не сможет узнать, существует ли это свойство на самом деле.

Теперь, если NLURunOpts будет всегда иметь свойство treeify, а NLUAddOpts не будет никогда , тогда вы можете сделать следующее:

if ('treeify' in opts) {
    // opts is now of 'NLURunOpts' type
}

Вы также можете определить тип защиты:

function isRunOpts(opts: any): opts is NLURunOpts {
    return opts.treeify !== undefined;
}

if (isRunOpts(opts)) {
    // opts is now of 'NLURunOpts' type
}

В противном случае вы можете сделать следующее:

if((opts as NLURunOpts).treeify) {

}

, который утверждает, что opts имеет тип NLURunOpts

...