Как сказать компилятору, что эта переменная не является примитивным значением? - PullRequest
0 голосов
/ 14 февраля 2019

Я хочу объявить, что аргументы моей функции являются объектами.

function foo(obj1: object, obj2: object){
  obj1.name = 'foo'
  obj2[MAYBE_ANY_PROPERTIES] = 'bar'
}

Но когда я пытаюсь скомпилировать, tsc сообщает, что Property 'name' does not exist on type '{}'.

Я понимаю эту ошибку, но в любом случаеЯ хочу сказать компилятору, что obj1 - это объект, который может иметь любые свойства, но он никогда не должен быть примитивным значением.Как я могу это сделать?

1 Ответ

0 голосов
/ 14 февраля 2019

Если вы хотите, чтобы объект был индексируемым, вам нужен индекс string.Вы можете использовать тип Record, чтобы получить этот эффект:

function foo(obj1: Record<string, any>, obj2: Record<string, any>){
  obj1.name = 'foo'
}

foo(1, 2) //err
foo("", "") // err

foo({ name: "" }, { name: "" }) // ok

Вы можете рассмотреть более строгий тип, если ваши объекты должны содержать определенное свойство:

function foo(obj1: {name: string } & Record<string, any>, obj2: {name: string } & Record<string, any>) {
  obj1.name = 'foo'
}

foo({ name: "" }, { name_: "" }) // error no name
...