我应该如何将参数类型注释为“对象的任何值”?
class ExampleClass {
private static readonly MODES = {
DEVELOPMENT: 0,
PRODUCTION: 1,
TEST: 2
}
// Any Value of ExampleClass.MODES
constructor(mode: MODE[?]) {
}
}
在这种情况下,如果使用0
,则值1
,2
,enum
毫无意义,但是
据我所知,我们不能使用enum
作为类字段。因此,让我们考虑这个问题中的some value of object
情况。
答案 0 :(得分:5)
Tomas非常接近,但让我们继续给出完整答案。要获取chown -R mysql:mysql /var/lib/mysql
的值类型,只需按其所有键的类型对其进行索引。
typeof MODES
答案 1 :(得分:1)
在这种实际情况下,您可以使用type
:
type myType = 'DEVELOPMENT' | 'PRODUCTION' | 'TEST'
class someClass {
// Any Value of ExampleClass.MODES
constructor(mode: myType ) { }
}
对于更高级的方案,请查看TypeScript文档中的以下代码片段,其中K extends keyof T
用于确保仅将作为对象规范一部分的值作为函数参数传递:
function pluck<T, K extends keyof T>(o: T, names: K[]): T[K][] {
return names.map(n => o[n]);
}
interface Person {
name: string;
age: number;
}
let person: Person = {
name: 'Jarid',
age: 35
};
let strings: string[] = pluck(person, ['name']); // ok, string[]
以上内容可以作为实用程序服务的一部分,并在希望确保类型的多个构造函数中普遍使用。
甚至将您希望保护的值包含在单独的类中,并直接使用keyof
:
class A {
prop1: 1;
prop2: 2;
}
class TestClass {
constructor(key: keyof A) {
}
}
let tc1 = new TestClass('prop1')
let tc2 = new TestClass('whoops') // Error
据我所知,您希望使用valueof
再加上keyof
之类的东西。如果是这样,那么是的,枚举和类型是您应该重点关注的内容。