TypeScript:如何将参数类型注释为“对象的任何值”?

时间:2018-10-23 11:08:27

标签: typescript types

我应该如何将参数类型注释为“对象的任何值”?

class ExampleClass {

    private static readonly MODES = {
        DEVELOPMENT: 0,
        PRODUCTION: 1,
        TEST: 2
    }

    //  Any Value of ExampleClass.MODES
    constructor(mode: MODE[?]) {

    }
}

在这种情况下,如果使用0,则值12enum毫无意义,但是 据我所知,我们不能使用enum作为类字段。因此,让我们考虑这个问题中的some value of object情况。

2 个答案:

答案 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之类的东西。如果是这样,那么是的,枚举和类型是您应该重点关注的内容。