我创建了这个对象数组。有人能告诉我如何在打字稿中定义这些吗?是可以进行内联还是需要两个定义?
userTestStatus xxxx = {
"0": { "id": 0, "name": "Available" },
"1": { "id": 1, "name": "Ready" },
"2": { "id": 2, "name": "Started" }
};
我希望更换" xxx"有一个定义(我认为这是正确的词)。因此,如果我错误地使用了像userTestStatus [3] .nammme这样的东西,那么后来的Typescript会提醒我。
答案 0 :(得分:181)
最好使用native array而不是具有类似数字属性的对象文字,这样编号(以及许多其他数组函数)就可以得到现成的处理。
您在这里寻找的是数组的内联interface定义,它定义了该数组中的每个元素,无论是最初存在还是稍后引入:
let userTestStatus: { id: number, name: string }[] = [
{ "id": 0, "name": "Available" },
{ "id": 1, "name": "Ready" },
{ "id": 2, "name": "Started" }
];
userTestStatus[34978].nammme; // Error: Property 'nammme' does not exist on type [...]
如果要立即使用值初始化数组,则显式类型定义不是必需的; TypeScript可以从初始赋值中自动推断出大多数元素类型:
let userTestStatus = [
{ "id": 0, "name": "Available" },
...
];
userTestStatus[34978].nammme; // Error: Property 'nammme' does not exist on type [...]
答案 1 :(得分:52)
上面的内容是一个对象,而不是一个数组。
要使数组使用[
& ]
围绕您的对象。
userTestStatus = [
{ "id": 0, "name": "Available" },
{ "id": 1, "name": "Ready" },
{ "id": 2, "name": "Started" }
];
除此之外,TypeScript是JavaScript的超集,因此无论有效的JavaScript都是有效的TypeScript,因此不需要进行其他更改。
来自OP的反馈澄清......需要对发布的模型进行定义
您可以使用此处定义的类型来表示对象模型:
type MyType = {
id: number;
name: string;
}
type MyGroupType = {
[key:string]: MyType;
}
var obj: MyGroupType = {
"0": { "id": 0, "name": "Available" },
"1": { "id": 1, "name": "Ready" },
"2": { "id": 2, "name": "Started" }
};
// or if you make it an array
var arr: MyType[] = [
{ "id": 0, "name": "Available" },
{ "id": 1, "name": "Ready" },
{ "id": 2, "name": "Started" }
];
答案 2 :(得分:12)
如果您正在寻找行为类似于枚举的内容(因为我看到您正在定义一个对象并附加一个顺序ID 0,1,2并包含您不想要的名称字段拼写错误(例如,名称与naaame),您最好定义枚举,因为顺序ID会自动处理,并为您提供开箱即用的类型验证。
enum TestStatus {
Available, // 0
Ready, // 1
Started, // 2
}
class Test {
status: TestStatus
}
var test = new Test();
test.status = TestStatus.Available; // type and spelling is checked for you,
// and the sequence ID is automatic
上述值将自动映射,例如" 0"对于"可用",您可以使用TestStatus.Available
访问它们。并且当你传递它们时,Typescript会强制执行该类型。
你想要一个数组的对象,(不完全是一个带键的对象" 0"," 1"" 2" ),所以让我们定义对象的类型,首先是一个包含数组的类型。
class TestStatus {
id: number
name: string
constructor(id, name){
this.id = id;
this.name = name;
}
}
type Statuses = Array<TestStatus>;
var statuses: Statuses = [
new TestStatus(0, "Available"),
new TestStatus(1, "Ready"),
new TestStatus(2, "Started")
]
答案 3 :(得分:12)
某些tslint
规则禁止使用[],示例消息:Array type using 'T[]' is forbidden for non-simple types. Use 'Array<T>' instead.
然后你会写它:
var userTestStatus: Array<{ id: number, name: string }> = Array(
{ "id": 0, "name": "Available" },
{ "id": 1, "name": "Ready" },
{ "id": 2, "name": "Started" }
);
答案 4 :(得分:4)
Array<T>
person: Array<{
name: string;
age: number;
}>
答案 5 :(得分:1)
var xxxx : { [key:number]: MyType };
答案 6 :(得分:1)
有点老了,但我觉得我可以对此进行一些澄清。
准确答案
interface MyObject {
id: number;
name: string;
}
interface MyExactData {
[key: string]: MyObject;
}
let userTestStatus: MyExactData = {
"0": { "id": 0, "name": "Available" },
"1": { "id": 1, "name": "Ready" },
"2": { "id": 2, "name": "Started" }
};
但上面不是我们通常做对象数组的方式,你会在javaScript中使用简单的原生数组。
interface MyObject { // define the object (singular)
id: number;
name: string;
}
let userTestStatus_better: MyObject[] = [
{ "id": 0, "name": "Available" },
{ "id": 1, "name": "Ready" },
{ "id": 2, "name": "Started" }
];
简单地将 []
添加到我们的界面中即可提供上述对象数组的类型。
并内联执行此操作
let userTestStatus_inline: {id:number, name:string}[] = [
{ "id": 0, "name": "Available" },
{ "id": 1, "name": "Ready" },
{ "id": 2, "name": "Started" }
];
我会使用该界面,因为您有一些可定义、可理解和可重用的东西。如果您需要进行更改,您可以对一个界面进行更改,打字稿会报告您的界面代码不匹配。
答案 7 :(得分:-1)
您也可以尝试
map $http_x_no_iframe_protection $x_frame_options {
yes "";
default "SAMEORIGIN";
}
server {
...
add_header X-Frame-Options $x_frame_options;
...
}
要检查记录的工作方式,请执行以下操作:https://www.typescriptlang.org/docs/handbook/utility-types.html#recordkt
在我们的案例中,Record用于声明一个对象,该对象的键将是一个字符串,其值将为IData类型,因此当我们尝试访问其属性时,它将为我们提供智能感知,并在出现万一情况下抛出类型错误我们将尝试类似userTestStatus [0] .nameee