在类中的TypeScript中,可以声明属性的类型,例如:
class className{
property : string;
};
我应该如何编写代码来声明对象文字中属性的类型?这样的代码不编译:
var obj = {
property: string;
};
(我收到错误 - 当前范围内不存在名称'string'。)
我做错了什么或者是一个错误?
答案 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,
};
使用TSX的as运算符。
var obj = {
property: null as string
};
更长的例子:
var call = {
hasStarted: null as boolean,
hasFinished: null as boolean,
id: null as number,
};
经过多年使用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)
type ObjType = {
property: string;
}
然后您可以使用它来绑定您的对象以仅接受此类型,如下所示。
const obj: ObjType = {
property: "TypeScript"
}