在TypeScript中的对象文字中键入定义

时间:2012-10-08 18:58:31

标签: typescript

在类中的TypeScript中,可以声明属性的类型,例如:

class className{
    property : string;
};

我应该如何编写代码来声明对象文字中属性的类型?这样的代码不编译:

var obj = {
    property: string;
};

(我收到错误 - 当前范围内不存在名称'string'。)

我做错了什么或者是一个错误?

11 个答案:

答案 0 :(得分:320)

您非常接近,只需将=替换为:即可。您可以使用对象类型文字(请参阅规范第3.5.3节)或界面。使用对象类型文字与您拥有的文字很接近:

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

但您也可以使用界面

interface MyObjLayout {
    property: string;
}

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

答案 1 :(得分:226)

使用强制转换操作符来简化(通过将null转换为所需类型)。

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 - 处理TSX(感谢@Josh)

使用TSX的as运算符。

var obj = {
    property: null as string
};

更长的例子:

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

更新2019-05-15(改进代码模式作为替代方案)

经过多年使用const并从更多功能代码中受益,我建议在大多数情况下不要使用上述代码。 (上面创建了一个可变对象,它将在整个函数中设置它的字段而不是一次性设置 - 这会导致不一致的状态错误。)

相反,我会建议尽可能多地使用const变量,然后将对象组成最后一步:

const id = GetId();
const hasStarted = true;
...
const hasFinished = false;
...
return {hasStarted, hasFinished, id};
  • 这将正确输入所有内容,而无需显式输入。
  • 无需重新输入字段名称。
  • 从我的经验中得到最干净的代码。
  • 这允许编译器提供更多状态验证(例如,如果在多个位置返回,编译器将确保始终返回相同类型的对象 - 这会鼓励您在每个位置声明整个返回值 - 给出这个价值的明确意图)。

答案 2 :(得分:14)

如果您的属性具有相同的类型,则可以使用预定义的实用程序类型Record

type Keys = "property" | "property2"

const obj: Record<Keys, string> = {
  property: "my first prop",
  property2: "my second prop",
};

您当然可以进一步定义属性值的自定义类型:

type Keys = "property" | "property2"
type Values = "my prop" | "my other allowed prop"

const obj: Record<Keys, Values> = {
  property: "my prop",
  property2: "my second prop", // TS Error: Type '"my second prop"' is not assignable to type 'Values'.
};

答案 3 :(得分:11)

如果您正在尝试编写类型注释,则语法为:

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

如果您正在尝试编写对象文字,则语法为:

var x = { property: 'hello' };

您的代码正在尝试在值位置使用类型名称。

答案 4 :(得分:7)

在TypeScript中,如果我们声明对象,那么我们使用以下语法:

[access modifier] variable name : { /* structure of object */ }

例如:

private Object:{ Key1: string, Key2: number }

答案 5 :(得分:2)

如果您要向分解后的对象文字中添加类型,例如在函数的参数中,则语法为:

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

foo({ bar: true, baz: 'lorem ipsum' });

答案 6 :(得分:1)

我很惊讶没有人提到这一点,但是您可以创建一个名为ObjectLiteral的单一接口,如下所示:

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

然后您将使用它,就像这样:

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

您可以根据需要多次重复使用此单个界面。

祝你好运。

答案 7 :(得分:1)

// 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());

答案 8 :(得分:1)

这就是我在 2021 年要做的事情:

const sm = {
  currentCacheName: '' as string,
  badSWTimer: 0 as number,
  reg: {} as ServiceWorkerRegistration,
  quantum: null as number | null
}

这不仅仅是一个值转换,而且与接口定义的工作方式相同,用于对象属性。

答案 9 :(得分: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" };

答案 10 :(得分:0)

  1. 使用 type 关键字创建类型
type ObjType = {
  property: string;
}

然后您可以使用它来绑定您的对象以仅接受此类型,如下所示。

const obj: ObjType = {
property: "TypeScript"
}