Определение типа в литерал объекта в машинописном

голоса
158

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

class className{
    property : string;
};

Как я должен написать код, чтобы объявить тип для недвижимости в литерала объекта? Такой код не компилировать:

var obj = {
    property: string;
};

(Я получаю сообщение об ошибке - Имя «строка» не существует в текущем контексте).

Что я делаю неправильно или это ошибка?

Задан 08/10/2012 в 19:58
источник пользователем
На других языках...                            


8 ответов

голоса
226

Вы очень близки, вам просто нужно заменить =с :. Вы можете использовать тип объекта буквальный (см спецификации раздел 3.5.3) или интерфейс. Используя тип объекта буквальным близок к тому , что у вас есть:

var obj: { property: string; } = { property: "foo" };

Но вы также можете использовать интерфейс

interface MyObjLayout {
    property: string;
}

var obj: MyObjLayout = { property: "foo" };
Ответил 08/10/2012 в 20:08
источник пользователем

голоса
131

Используйте оператор приведения, чтобы сделать это сжатым (литье нуля к нужному типу).

var obj = {
    property: <string> null
};

Более длинный пример:

var call = {
    hasStarted: <boolean> null,
    hasFinished: <boolean> null,
    id: <number> null,
};

Это намного лучше, чем две части (один, чтобы объявить типы, второе, чтобы объявить по умолчанию):

var callVerbose: {
    hasStarted: boolean;
    hasFinished: boolean;
    id: number;
} = {
    hasStarted: null,
    hasFinished: null,
    id: null,
};

Обновление 2016-02-10 - Для Handle TSX (Спасибо @Josh)

Используйте в качестве оператора для TSX.

var obj = {
    property: null as string
};

Более длинный пример:

var call = {
    hasStarted: null as boolean,
    hasFinished: null as boolean,
    id: null as number,
};
Ответил 11/10/2012 в 05:50
источник пользователем

голоса
8

Если вы пытаетесь написать аннотацию типа, синтаксис:

var x: { property: string; } = ...;

Если вы пытаетесь записать объект буквальным, синтаксис:

var x = { property: 'hello' };

Ваш код пытается использовать имя типа в позиции значения.

Ответил 08/10/2012 в 20:08
источник пользователем

голоса
4

В машинописи, если мы объявляем объект, то

[Модификатор доступа] имя переменной: {// структура объекта}

private Object:{Key1:string , Key2:number }
Ответил 08/01/2017 в 15:05
источник пользователем

голоса
0
// Use ..

const Per = {
  name: 'HAMZA',
  age: 20,
  coords: {
    tele: '09',
    lan: '190'
  },
  setAge(age: Number): void {
    this.age = age;
  },
  getAge(): Number {
    return age;
  }
};
const { age, name }: { age: Number; name: String } = Per;
const {
  coords: { tele, lan }
}: { coords: { tele: String; lan: String } } = Per;

console.log(Per.getAge());
Ответил 02/10/2019 в 18:56
источник пользователем

голоса
0

В коде:

var obj = {
  myProp: string;
};

Вы фактически создаете объект буквальным и присвоение переменной строки к свойству myProp. Хотя очень плохая практика, это будет фактически правильный код TS (не используйте это!):

var string = 'A string';

var obj = {
  property: string
};

Тем не менее, то, что вы хотите, что объект буквальный набираются. Это может быть достигнуто различными способами:

Интерфейс:

interface myObj {
    property: string;
}

var obj: myObj = { property: "My string" };

Тип Нестандартные:

type myObjType = {
    property: string
};

var obj: myObjType = { property: "My string" };

В ролях Оператор:

var obj = {
    myString: <string> 'hi',
    myNumber: <number> 132,
};

Тип объекта литерала:

var obj: { property: string; } = { property: "Mystring" };
Ответил 05/08/2019 в 12:06
источник пользователем

голоса
0

Я удивлен , что не упомянул что ничье это , но вы можете просто создать единый интерфейс под названием ObjectLiteral, например:

interface ObjectLiteral {
  [key: string]: any;
}

Тогда вы будете использовать его, как это:

let data: ObjectLiteral = {
  hello: "world",
  goodbye: 1,
  // ...
};

Вы можете повторно использовать этот единый интерфейс столько раз, сколько вы хотите.

Удачи.

Ответил 20/05/2019 в 11:56
источник пользователем

голоса
0

Если вы пытаетесь добавить типизации к деструктурированному литералу объекту, например , в качестве аргументов функции, синтаксис:

function foo({ bar, baz }: { bar: boolean, baz: string }) {
  // ...
}

foo({ bar: true, baz: 'lorem ipsum' });
Ответил 07/03/2019 в 01:22
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more