Cập nhật 2019-05-15 (Mẫu mã được cải tiến thay thế)
Sau nhiều năm sử dụng const
và hưởng lợi từ nhiều mã chức năng hơn, tôi sẽ khuyên bạn không nên sử dụng phần dưới đây trong hầu hết các trường hợp. (Khi xây dựng các đối tượng, việc buộc hệ thống loại thành một loại cụ thể thay vì để nó suy ra các loại thường là một dấu hiệu cho thấy có gì đó không đúng).
Thay vào đó, tôi khuyên bạn nên sử dụng const
các biến càng nhiều càng tốt và sau đó soạn đối tượng làm bước cuối cùng:
const id = GetId();
const hasStarted = true;
...
const hasFinished = false;
...
return {hasStarted, hasFinished, id};
- Điều này sẽ gõ đúng mọi thứ mà không cần gõ rõ ràng.
- Không cần phải gõ lại tên trường.
- Điều này dẫn đến mã sạch nhất từ kinh nghiệm của tôi.
- Điều này cho phép trình biên dịch cung cấp xác minh trạng thái nhiều hơn (ví dụ: nếu bạn quay lại ở nhiều vị trí, trình biên dịch sẽ đảm bảo cùng một loại đối tượng luôn được trả về - điều này khuyến khích bạn khai báo toàn bộ giá trị trả về tại mỗi vị trí - cho thấy rõ ràng hoàn toàn ý định của giá trị đó).
Bổ sung 2020-02-26
Nếu bạn thực sự cần một loại mà bạn có thể được khởi tạo một cách lười biếng: Đánh dấu nó là một loại kết hợp nullable (null hoặc Type). Hệ thống loại sẽ ngăn bạn sử dụng nó mà không đảm bảo trước tiên nó có giá trị.
Trong tsconfig.json
, đảm bảo bạn kích hoạt kiểm tra null nghiêm ngặt:
"strictNullChecks": true
Sau đó sử dụng mẫu này và cho phép hệ thống loại bảo vệ bạn khỏi quyền truy cập vô tình / không xác định:
const state = {
instance: null as null | ApiService,
// OR
// instance: undefined as undefined | ApiService,
};
const useApi = () => {
// If I try to use it here, the type system requires a safe way to access it
// Simple lazy-initialization
const api = state?.instance ?? (state.instance = new ApiService());
api.fun();
// Also here are some ways to only access it if it has value:
// The 'right' way: Typescript 3.7 required
state.instance?.fun();
// Or the old way: If you are stuck before Typescript 3.7
state.instance && state.instance.fun();
// Or the long winded way because the above just feels weird
if (state.instance) { state.instance.fun(); }
// Or the I came from C and can't check for nulls like they are booleans way
if (state.instance != null) { state.instance.fun(); }
// Or the I came from C and can't check for nulls like they are booleans
// AND I was told to always use triple === in javascript even with null checks way
if (state.instance !== null && state.instance !== undefined) { state.instance.fun(); }
};
class ApiService {
fun() {
// Do something useful here
}
}
Không làm như sau trong 99% trường hợp:
Cập nhật 2016 / 02-10 - Để xử lý TSX (Cảm ơn @Josh)
Sử dụng as
toán tử cho TSX.
var obj = {
property: null as string
};
Một ví dụ dài hơn:
var call = {
hasStarted: null as boolean,
hasFinished: null as boolean,
id: null as number,
};
Câu trả lời gốc
Sử dụng toán tử cast để tạo ra súc tích này (bằng cách chuyển null thành loại mong muốn).
var obj = {
property: <string> null
};
Một ví dụ dài hơn:
var call = {
hasStarted: <boolean> null,
hasFinished: <boolean> null,
id: <number> null,
};
Điều này tốt hơn nhiều so với việc có hai phần (một phần để khai báo các loại, phần thứ hai để khai báo mặc định):
var callVerbose: {
hasStarted: boolean;
hasFinished: boolean;
id: number;
} = {
hasStarted: null,
hasFinished: null,
id: null,
};