Type Modifiers
Member Access Modifiers
public, protected and private:
class Singleton {
private static instance: Singleton
private constructor() {
// ..
}
public static getInstance() {
if (!Singleton.instance)
Singleton.instance = new Singleton()
return Singleton.instance
}
someMethod() {}
}
const someThing = new Singleton() // Error: constructor of 'singleton' is private
const instance = Singleton.getInstance() // do some thing with the instance
Readonly Type Modifier
readonly:
interface Foo {
readonly bar: number
readonly bas: number
}
// 初始化
const foo: Foo = { bar: 123, bas: 456 }
// 不能被改变
foo.bar = 456 // Error: foo.bar 为仅读属性
readonly indexable signature:
type Foo = Readonly<Record<number, number>>
// 使用
const foo: Foo = { 0: 123, 2: 345 }
console.log(foo[0]) // ok (读取)
foo[0] = 456 // Error: 属性只读
readonly class properties:
class Foo {
readonly bar = 1 // OK
readonly baz: string
constructor() {
this.baz = 'hello' // OK
}
}
readonly generic type:
interface Foo {
bar: number
bas: number
}
type FooReadonly = Readonly<Foo>
const foo: Foo = { bar: 123, bas: 456 }
const fooReadonly: FooReadonly = { bar: 123, bas: 456 }
foo.bar = 456 // ok
fooReadonly.bar = 456 // Error: bar 属性只读
readonly React props:
class Something extends React.Component<{ foo: number }, { baz: number }> {
someMethod() {
this.props.foo = 123 // Error: props 是不可变的
this.state.baz = 456 // Error: 你应该使用 this.setState()
}
}
readonly is shallow:
const dates: readonly Date[] = [new Date()]
dates.push(new Date()) // Error
dates[0].setFullYear(2037) // OK